ERC-721
NFT
Overview
Max Total Supply
6,626 PEPPER
Holders
1,251
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 PEPPERLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Pepper
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-21 */ // Sources flattened with hardhat v2.4.1 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @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; } // File @openzeppelin/contracts/token/ERC721/[email protected] 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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] 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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } // File @openzeppelin/contracts/utils/[email protected] 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; } } // File @openzeppelin/contracts/utils/[email protected] 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); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @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; } } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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(to).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 {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/math/[email protected] pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/Pepper.sol pragma solidity ^0.8.0; contract Pepper is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public constant MAX_PEPPERS = 10000; uint256 public constant MAX_PURCHASES_PER_TRANSACTION = 20; uint256 public constant TOTAL_RESERVED_PEPPERS = 100; // Reserved for supporters and events bool public isSaleActive = false; uint256 public price = 50000000000000000; // 0.05 ETH string internal _baseTokenURI; constructor(string memory baseURI) ERC721("Pepper Attack", "PEPPER") { updateBaseURI(baseURI); } modifier saleHasNotEnded{ require(totalSupply() < MAX_PEPPERS, "Sale has ended."); _; } function mintPeppers(uint256 numTokens) public payable saleHasNotEnded { if(msg.sender != owner()){ require(isSaleActive, "Sale is not active."); } require(SafeMath.add(totalSupply(), numTokens) <= MAX_PEPPERS, "Exceeds total pepper supply."); require(totalSupply() < MAX_PEPPERS, "Sale has ended."); require(numTokens <= MAX_PURCHASES_PER_TRANSACTION, "Exceeds max purchases."); require(msg.value >= calculatePrice(numTokens), "Insufficient payment value."); for(uint256 i = 0; i < numTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function calculatePrice(uint256 numTokens) internal view returns (uint256) { return price * numTokens; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : ""; } /* ---------------------------------- onlyOwner functions ---------------------------------- */ function getBaseURI() public onlyOwner view returns (string memory) { return _baseURI(); } /** * Update tokenURI through baseURI. * This function will be called when setting the initial tokenURI and when revealing the Peppers */ function updateBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function updatePrice(uint newPrice) public onlyOwner { price = newPrice; } function setSaleActive(bool isActive) public onlyOwner { isSaleActive = isActive; } function withdrawAll() public payable onlyOwner { require(payable(_msgSender()).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PEPPERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASES_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_RESERVED_PEPPERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mintPeppers","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff02191690831515021790555066b1a2bc2ec50000600b553480156200003757600080fd5b50604051620045763803806200457683398181016040528101906200005d9190620003fa565b6040518060400160405280600d81526020017f5065707065722041747461636b000000000000000000000000000000000000008152506040518060400160405280600681526020017f50455050455200000000000000000000000000000000000000000000000000008152508160009080519060200190620000e1929190620002d8565b508060019080519060200190620000fa929190620002d8565b5050506200011d620001116200013560201b60201c565b6200013d60201b60201c565b6200012e816200020360201b60201c565b50620005e5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002136200013560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000239620002ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000481565b60405180910390fd5b80600c9080519060200190620002aa929190620002d8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002e69062000551565b90600052602060002090601f0160209004810192826200030a576000855562000356565b82601f106200032557805160ff191683800117855562000356565b8280016001018555821562000356579182015b828111156200035557825182559160200191906001019062000338565b5b50905062000365919062000369565b5090565b5b80821115620003845760008160009055506001016200036a565b5090565b60006200039f6200039984620004d7565b620004a3565b905082815260208101848484011115620003b857600080fd5b620003c58482856200051b565b509392505050565b600082601f830112620003df57600080fd5b8151620003f184826020860162000388565b91505092915050565b6000602082840312156200040d57600080fd5b600082015167ffffffffffffffff8111156200042857600080fd5b6200043684828501620003cd565b91505092915050565b60006200044e6020836200050a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200049c816200043f565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620004cd57620004cc620005b6565b5b8060405250919050565b600067ffffffffffffffff821115620004f557620004f4620005b6565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200053b5780820151818401526020810190506200051e565b838111156200054b576000848401525b50505050565b600060028204905060018216806200056a57607f821691505b6020821081141562000581576200058062000587565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f8180620005f56000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a035b1fe11610095578063d2ad002e11610064578063d2ad002e14610669578063e985e9c514610694578063f2fde38b146106d1578063fae176a8146106fa576101cd565b8063a035b1fe146105af578063a22cb465146105da578063b88d4fde14610603578063c87b56dd1461062c576101cd565b80638d6cc56d116100d15780638d6cc56d146105075780638da5cb5b14610530578063931688cb1461055b57806395d89b4114610584576101cd565b8063715018a6146104bd578063841718a6146104d4578063853828b6146104fd576101cd565b80632f745c591161016f5780636352211e1161013e5780636352211e146103ed57806363971d561461042a57806370a0823114610455578063714c539814610492576101cd565b80632f745c591461031f57806342842e0e1461035c5780634f6ccce714610385578063564566a8146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806312fa81f3146102a057806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612d1e565b610716565b604051610206919061379f565b60405180910390f35b34801561021b57600080fd5b50610224610790565b60405161023191906137ba565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612db1565b610822565b60405161026e9190613738565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb9565b6108a7565b005b3480156102ac57600080fd5b506102b56109bf565b6040516102c29190613abc565b60405180910390f35b3480156102d757600080fd5b506102e06109c4565b6040516102ed9190613abc565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612bb3565b6109d1565b005b34801561032b57600080fd5b5061034660048036038101906103419190612cb9565b610a31565b6040516103539190613abc565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612bb3565b610ad6565b005b34801561039157600080fd5b506103ac60048036038101906103a79190612db1565b610af6565b6040516103b99190613abc565b60405180910390f35b3480156103ce57600080fd5b506103d7610b8d565b6040516103e4919061379f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190612db1565b610ba0565b6040516104219190613738565b60405180910390f35b34801561043657600080fd5b5061043f610c52565b60405161044c9190613abc565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190612b4e565b610c57565b6040516104899190613abc565b60405180910390f35b34801561049e57600080fd5b506104a7610d0f565b6040516104b491906137ba565b60405180910390f35b3480156104c957600080fd5b506104d2610d9a565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190612cf5565b610e22565b005b610505610ebb565b005b34801561051357600080fd5b5061052e60048036038101906105299190612db1565b610f7e565b005b34801561053c57600080fd5b50610545611004565b6040516105529190613738565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190612d70565b61102e565b005b34801561059057600080fd5b506105996110c4565b6040516105a691906137ba565b60405180910390f35b3480156105bb57600080fd5b506105c4611156565b6040516105d19190613abc565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612c7d565b61115c565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612c02565b6112dd565b005b34801561063857600080fd5b50610653600480360381019061064e9190612db1565b61133f565b60405161066091906137ba565b60405180910390f35b34801561067557600080fd5b5061067e6113e6565b60405161068b9190613abc565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190612b77565b6113ec565b6040516106c8919061379f565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190612b4e565b611480565b005b610714600480360381019061070f9190612db1565b611578565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107895750610788826117af565b5b9050919050565b60606000805461079f90613d76565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb90613d76565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b600061082d82611891565b61086c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108639061397c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b282610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90613a1c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109426118fd565b73ffffffffffffffffffffffffffffffffffffffff16148061097157506109708161096b6118fd565b6113ec565b5b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a7906138fc565b60405180910390fd5b6109ba8383611905565b505050565b601481565b6000600880549050905090565b6109e26109dc6118fd565b826119be565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613a3c565b60405180910390fd5b610a2c838383611a9c565b505050565b6000610a3c83610c57565b8210610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a74906137dc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610af1838383604051806020016040528060008152506112dd565b505050565b6000610b006109c4565b8210610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613a7c565b60405180910390fd5b60088281548110610b7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c409061393c565b60405180910390fd5b80915050919050565b606481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf9061391c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610d196118fd565b73ffffffffffffffffffffffffffffffffffffffff16610d37611004565b73ffffffffffffffffffffffffffffffffffffffff1614610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d849061399c565b60405180910390fd5b610d95611cf8565b905090565b610da26118fd565b73ffffffffffffffffffffffffffffffffffffffff16610dc0611004565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d9061399c565b60405180910390fd5b610e206000611d8a565b565b610e2a6118fd565b73ffffffffffffffffffffffffffffffffffffffff16610e48611004565b73ffffffffffffffffffffffffffffffffffffffff1614610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e959061399c565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610ec36118fd565b73ffffffffffffffffffffffffffffffffffffffff16610ee1611004565b73ffffffffffffffffffffffffffffffffffffffff1614610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061399c565b60405180910390fd5b610f3f6118fd565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f7c57600080fd5b565b610f866118fd565b73ffffffffffffffffffffffffffffffffffffffff16610fa4611004565b73ffffffffffffffffffffffffffffffffffffffff1614610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061399c565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110366118fd565b73ffffffffffffffffffffffffffffffffffffffff16611054611004565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a19061399c565b60405180910390fd5b80600c90805190602001906110c0929190612972565b5050565b6060600180546110d390613d76565b80601f01602080910402602001604051908101604052809291908181526020018280546110ff90613d76565b801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050505050905090565b600b5481565b6111646118fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c9906138bc565b60405180910390fd5b80600560006111df6118fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661128c6118fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112d1919061379f565b60405180910390a35050565b6112ee6112e86118fd565b836119be565b61132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613a3c565b60405180910390fd5b61133984848484611e50565b50505050565b606061134a82611891565b611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906139dc565b60405180910390fd5b6000611393611cf8565b905060008151116113b357604051806020016040528060008152506113de565b806113bd84611eac565b6040516020016113ce9291906136fe565b6040516020818303038152906040525b915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114886118fd565b73ffffffffffffffffffffffffffffffffffffffff166114a6611004565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f39061399c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115639061381c565b60405180910390fd5b61157581611d8a565b50565b6127106115836109c4565b106115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba9061387c565b60405180910390fd5b6115cb611004565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164d57600a60149054906101000a900460ff1661164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906139fc565b60405180910390fd5b5b61271061166161165b6109c4565b83612059565b11156116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990613a9c565b60405180910390fd5b6127106116ad6109c4565b106116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e49061387c565b60405180910390fd5b6014811115611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061385c565b60405180910390fd5b61173a8161206f565b34101561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613a5c565b60405180910390fd5b60005b818110156117ab57611798336117936109c4565b612086565b80806117a390613da8565b91505061177f565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061188a5750611889826120a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661197883610ba0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119c982611891565b611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff906138dc565b60405180910390fd5b6000611a1383610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a8257508373ffffffffffffffffffffffffffffffffffffffff16611a6a84610822565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a935750611a9281856113ec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611abc82610ba0565b73ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906139bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b799061389c565b60405180910390fd5b611b8d83838361210e565b611b98600082611905565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611be89190613c8c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c3f9190613bab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6060600c8054611d0790613d76565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3390613d76565b8015611d805780601f10611d5557610100808354040283529160200191611d80565b820191906000526020600020905b815481529060010190602001808311611d6357829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e5b848484611a9c565b611e6784848484612222565b611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906137fc565b60405180910390fd5b50505050565b60606000821415611ef4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612054565b600082905060005b60008214611f26578080611f0f90613da8565b915050600a82611f1f9190613c01565b9150611efc565b60008167ffffffffffffffff811115611f68577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f9a5781602001600182028036833780820191505090505b5090505b6000851461204d57600182611fb39190613c8c565b9150600a85611fc29190613df1565b6030611fce9190613bab565b60f81b81838151811061200a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120469190613c01565b9450611f9e565b8093505050505b919050565b600081836120679190613bab565b905092915050565b600081600b5461207f9190613c32565b9050919050565b6120a08282604051806020016040528060008152506123b9565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612119838383612414565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561215c5761215781612419565b61219b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219a576121998382612462565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121de576121d9816125cf565b61221d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221c5761221b8282612712565b5b5b505050565b60006122438473ffffffffffffffffffffffffffffffffffffffff16612791565b156123ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226c6118fd565b8786866040518563ffffffff1660e01b815260040161228e9493929190613753565b602060405180830381600087803b1580156122a857600080fd5b505af19250505080156122d957506040513d601f19601f820116820180604052508101906122d69190612d47565b60015b61235c573d8060008114612309576040519150601f19603f3d011682016040523d82523d6000602084013e61230e565b606091505b50600081511415612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b906137fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b1565b600190505b949350505050565b6123c383836127a4565b6123d06000848484612222565b61240f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612406906137fc565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246f84610c57565b6124799190613c8c565b905060006007600084815260200190815260200160002054905081811461255e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125e39190613c8c565b9050600060096000848152602001908152602001600020549050600060088381548110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612681577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271d83610c57565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280b9061395c565b60405180910390fd5b61281d81611891565b1561285d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128549061383c565b60405180910390fd5b6128696000838361210e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b99190613bab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461297e90613d76565b90600052602060002090601f0160209004810192826129a057600085556129e7565b82601f106129b957805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e65782518255916020019190600101906129cb565b5b5090506129f491906129f8565b5090565b5b80821115612a115760008160009055506001016129f9565b5090565b6000612a28612a2384613b08565b613ad7565b905082815260208101848484011115612a4057600080fd5b612a4b848285613d34565b509392505050565b6000612a66612a6184613b38565b613ad7565b905082815260208101848484011115612a7e57600080fd5b612a89848285613d34565b509392505050565b600081359050612aa081613eef565b92915050565b600081359050612ab581613f06565b92915050565b600081359050612aca81613f1d565b92915050565b600081519050612adf81613f1d565b92915050565b600082601f830112612af657600080fd5b8135612b06848260208601612a15565b91505092915050565b600082601f830112612b2057600080fd5b8135612b30848260208601612a53565b91505092915050565b600081359050612b4881613f34565b92915050565b600060208284031215612b6057600080fd5b6000612b6e84828501612a91565b91505092915050565b60008060408385031215612b8a57600080fd5b6000612b9885828601612a91565b9250506020612ba985828601612a91565b9150509250929050565b600080600060608486031215612bc857600080fd5b6000612bd686828701612a91565b9350506020612be786828701612a91565b9250506040612bf886828701612b39565b9150509250925092565b60008060008060808587031215612c1857600080fd5b6000612c2687828801612a91565b9450506020612c3787828801612a91565b9350506040612c4887828801612b39565b925050606085013567ffffffffffffffff811115612c6557600080fd5b612c7187828801612ae5565b91505092959194509250565b60008060408385031215612c9057600080fd5b6000612c9e85828601612a91565b9250506020612caf85828601612aa6565b9150509250929050565b60008060408385031215612ccc57600080fd5b6000612cda85828601612a91565b9250506020612ceb85828601612b39565b9150509250929050565b600060208284031215612d0757600080fd5b6000612d1584828501612aa6565b91505092915050565b600060208284031215612d3057600080fd5b6000612d3e84828501612abb565b91505092915050565b600060208284031215612d5957600080fd5b6000612d6784828501612ad0565b91505092915050565b600060208284031215612d8257600080fd5b600082013567ffffffffffffffff811115612d9c57600080fd5b612da884828501612b0f565b91505092915050565b600060208284031215612dc357600080fd5b6000612dd184828501612b39565b91505092915050565b612de381613cc0565b82525050565b612df281613cd2565b82525050565b6000612e0382613b68565b612e0d8185613b7e565b9350612e1d818560208601613d43565b612e2681613ede565b840191505092915050565b6000612e3c82613b73565b612e468185613b8f565b9350612e56818560208601613d43565b612e5f81613ede565b840191505092915050565b6000612e7582613b73565b612e7f8185613ba0565b9350612e8f818560208601613d43565b80840191505092915050565b6000612ea8602b83613b8f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f0e603283613b8f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f74602683613b8f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fda601c83613b8f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061301a601683613b8f565b91507f45786365656473206d6178207075726368617365732e000000000000000000006000830152602082019050919050565b600061305a600f83613b8f565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b600061309a602483613b8f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613100601983613b8f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613140602c83613b8f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131a6603883613b8f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061320c602a83613b8f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613272602983613b8f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d8602083613b8f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613318602c83613b8f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061337e600583613ba0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006133be602083613b8f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133fe602983613b8f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613464602f83613b8f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ca601383613b8f565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b600061350a602183613b8f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613570603183613b8f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006135d6601b83613b8f565b91507f496e73756666696369656e74207061796d656e742076616c75652e00000000006000830152602082019050919050565b6000613616602c83613b8f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061367c601c83613b8f565b91507f4578636565647320746f74616c2070657070657220737570706c792e000000006000830152602082019050919050565b60006136bc600183613ba0565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6136f881613d2a565b82525050565b600061370a8285612e6a565b9150613715826136af565b91506137218284612e6a565b915061372c82613371565b91508190509392505050565b600060208201905061374d6000830184612dda565b92915050565b60006080820190506137686000830187612dda565b6137756020830186612dda565b61378260408301856136ef565b81810360608301526137948184612df8565b905095945050505050565b60006020820190506137b46000830184612de9565b92915050565b600060208201905081810360008301526137d48184612e31565b905092915050565b600060208201905081810360008301526137f581612e9b565b9050919050565b6000602082019050818103600083015261381581612f01565b9050919050565b6000602082019050818103600083015261383581612f67565b9050919050565b6000602082019050818103600083015261385581612fcd565b9050919050565b600060208201905081810360008301526138758161300d565b9050919050565b600060208201905081810360008301526138958161304d565b9050919050565b600060208201905081810360008301526138b58161308d565b9050919050565b600060208201905081810360008301526138d5816130f3565b9050919050565b600060208201905081810360008301526138f581613133565b9050919050565b6000602082019050818103600083015261391581613199565b9050919050565b60006020820190508181036000830152613935816131ff565b9050919050565b6000602082019050818103600083015261395581613265565b9050919050565b60006020820190508181036000830152613975816132cb565b9050919050565b600060208201905081810360008301526139958161330b565b9050919050565b600060208201905081810360008301526139b5816133b1565b9050919050565b600060208201905081810360008301526139d5816133f1565b9050919050565b600060208201905081810360008301526139f581613457565b9050919050565b60006020820190508181036000830152613a15816134bd565b9050919050565b60006020820190508181036000830152613a35816134fd565b9050919050565b60006020820190508181036000830152613a5581613563565b9050919050565b60006020820190508181036000830152613a75816135c9565b9050919050565b60006020820190508181036000830152613a9581613609565b9050919050565b60006020820190508181036000830152613ab58161366f565b9050919050565b6000602082019050613ad160008301846136ef565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613afe57613afd613eaf565b5b8060405250919050565b600067ffffffffffffffff821115613b2357613b22613eaf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b5357613b52613eaf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bb682613d2a565b9150613bc183613d2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bf657613bf5613e22565b5b828201905092915050565b6000613c0c82613d2a565b9150613c1783613d2a565b925082613c2757613c26613e51565b5b828204905092915050565b6000613c3d82613d2a565b9150613c4883613d2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8157613c80613e22565b5b828202905092915050565b6000613c9782613d2a565b9150613ca283613d2a565b925082821015613cb557613cb4613e22565b5b828203905092915050565b6000613ccb82613d0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d61578082015181840152602081019050613d46565b83811115613d70576000848401525b50505050565b60006002820490506001821680613d8e57607f821691505b60208210811415613da257613da1613e80565b5b50919050565b6000613db382613d2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613de657613de5613e22565b5b600182019050919050565b6000613dfc82613d2a565b9150613e0783613d2a565b925082613e1757613e16613e51565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613ef881613cc0565b8114613f0357600080fd5b50565b613f0f81613cd2565b8114613f1a57600080fd5b50565b613f2681613cde565b8114613f3157600080fd5b50565b613f3d81613d2a565b8114613f4857600080fd5b5056fea2646970667358221220193d8d7c3748d5f86b855bcd221b7207395dfa81fa6809fd5350493ff6c9ff4d64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d573147356a7257584159724637683273686e46416976386b51596143463258777a56767a666138435177573700000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a035b1fe11610095578063d2ad002e11610064578063d2ad002e14610669578063e985e9c514610694578063f2fde38b146106d1578063fae176a8146106fa576101cd565b8063a035b1fe146105af578063a22cb465146105da578063b88d4fde14610603578063c87b56dd1461062c576101cd565b80638d6cc56d116100d15780638d6cc56d146105075780638da5cb5b14610530578063931688cb1461055b57806395d89b4114610584576101cd565b8063715018a6146104bd578063841718a6146104d4578063853828b6146104fd576101cd565b80632f745c591161016f5780636352211e1161013e5780636352211e146103ed57806363971d561461042a57806370a0823114610455578063714c539814610492576101cd565b80632f745c591461031f57806342842e0e1461035c5780634f6ccce714610385578063564566a8146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806312fa81f3146102a057806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612d1e565b610716565b604051610206919061379f565b60405180910390f35b34801561021b57600080fd5b50610224610790565b60405161023191906137ba565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612db1565b610822565b60405161026e9190613738565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb9565b6108a7565b005b3480156102ac57600080fd5b506102b56109bf565b6040516102c29190613abc565b60405180910390f35b3480156102d757600080fd5b506102e06109c4565b6040516102ed9190613abc565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612bb3565b6109d1565b005b34801561032b57600080fd5b5061034660048036038101906103419190612cb9565b610a31565b6040516103539190613abc565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612bb3565b610ad6565b005b34801561039157600080fd5b506103ac60048036038101906103a79190612db1565b610af6565b6040516103b99190613abc565b60405180910390f35b3480156103ce57600080fd5b506103d7610b8d565b6040516103e4919061379f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190612db1565b610ba0565b6040516104219190613738565b60405180910390f35b34801561043657600080fd5b5061043f610c52565b60405161044c9190613abc565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190612b4e565b610c57565b6040516104899190613abc565b60405180910390f35b34801561049e57600080fd5b506104a7610d0f565b6040516104b491906137ba565b60405180910390f35b3480156104c957600080fd5b506104d2610d9a565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190612cf5565b610e22565b005b610505610ebb565b005b34801561051357600080fd5b5061052e60048036038101906105299190612db1565b610f7e565b005b34801561053c57600080fd5b50610545611004565b6040516105529190613738565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190612d70565b61102e565b005b34801561059057600080fd5b506105996110c4565b6040516105a691906137ba565b60405180910390f35b3480156105bb57600080fd5b506105c4611156565b6040516105d19190613abc565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612c7d565b61115c565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612c02565b6112dd565b005b34801561063857600080fd5b50610653600480360381019061064e9190612db1565b61133f565b60405161066091906137ba565b60405180910390f35b34801561067557600080fd5b5061067e6113e6565b60405161068b9190613abc565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190612b77565b6113ec565b6040516106c8919061379f565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190612b4e565b611480565b005b610714600480360381019061070f9190612db1565b611578565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107895750610788826117af565b5b9050919050565b60606000805461079f90613d76565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb90613d76565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b600061082d82611891565b61086c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108639061397c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b282610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90613a1c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109426118fd565b73ffffffffffffffffffffffffffffffffffffffff16148061097157506109708161096b6118fd565b6113ec565b5b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a7906138fc565b60405180910390fd5b6109ba8383611905565b505050565b601481565b6000600880549050905090565b6109e26109dc6118fd565b826119be565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613a3c565b60405180910390fd5b610a2c838383611a9c565b505050565b6000610a3c83610c57565b8210610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a74906137dc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610af1838383604051806020016040528060008152506112dd565b505050565b6000610b006109c4565b8210610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613a7c565b60405180910390fd5b60088281548110610b7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c409061393c565b60405180910390fd5b80915050919050565b606481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf9061391c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060610d196118fd565b73ffffffffffffffffffffffffffffffffffffffff16610d37611004565b73ffffffffffffffffffffffffffffffffffffffff1614610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d849061399c565b60405180910390fd5b610d95611cf8565b905090565b610da26118fd565b73ffffffffffffffffffffffffffffffffffffffff16610dc0611004565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d9061399c565b60405180910390fd5b610e206000611d8a565b565b610e2a6118fd565b73ffffffffffffffffffffffffffffffffffffffff16610e48611004565b73ffffffffffffffffffffffffffffffffffffffff1614610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e959061399c565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610ec36118fd565b73ffffffffffffffffffffffffffffffffffffffff16610ee1611004565b73ffffffffffffffffffffffffffffffffffffffff1614610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061399c565b60405180910390fd5b610f3f6118fd565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f7c57600080fd5b565b610f866118fd565b73ffffffffffffffffffffffffffffffffffffffff16610fa4611004565b73ffffffffffffffffffffffffffffffffffffffff1614610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061399c565b60405180910390fd5b80600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110366118fd565b73ffffffffffffffffffffffffffffffffffffffff16611054611004565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a19061399c565b60405180910390fd5b80600c90805190602001906110c0929190612972565b5050565b6060600180546110d390613d76565b80601f01602080910402602001604051908101604052809291908181526020018280546110ff90613d76565b801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050505050905090565b600b5481565b6111646118fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c9906138bc565b60405180910390fd5b80600560006111df6118fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661128c6118fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112d1919061379f565b60405180910390a35050565b6112ee6112e86118fd565b836119be565b61132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613a3c565b60405180910390fd5b61133984848484611e50565b50505050565b606061134a82611891565b611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906139dc565b60405180910390fd5b6000611393611cf8565b905060008151116113b357604051806020016040528060008152506113de565b806113bd84611eac565b6040516020016113ce9291906136fe565b6040516020818303038152906040525b915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114886118fd565b73ffffffffffffffffffffffffffffffffffffffff166114a6611004565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f39061399c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115639061381c565b60405180910390fd5b61157581611d8a565b50565b6127106115836109c4565b106115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba9061387c565b60405180910390fd5b6115cb611004565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164d57600a60149054906101000a900460ff1661164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906139fc565b60405180910390fd5b5b61271061166161165b6109c4565b83612059565b11156116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990613a9c565b60405180910390fd5b6127106116ad6109c4565b106116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e49061387c565b60405180910390fd5b6014811115611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061385c565b60405180910390fd5b61173a8161206f565b34101561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613a5c565b60405180910390fd5b60005b818110156117ab57611798336117936109c4565b612086565b80806117a390613da8565b91505061177f565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061187a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061188a5750611889826120a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661197883610ba0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119c982611891565b611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff906138dc565b60405180910390fd5b6000611a1383610ba0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a8257508373ffffffffffffffffffffffffffffffffffffffff16611a6a84610822565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a935750611a9281856113ec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611abc82610ba0565b73ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906139bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b799061389c565b60405180910390fd5b611b8d83838361210e565b611b98600082611905565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611be89190613c8c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c3f9190613bab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6060600c8054611d0790613d76565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3390613d76565b8015611d805780601f10611d5557610100808354040283529160200191611d80565b820191906000526020600020905b815481529060010190602001808311611d6357829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e5b848484611a9c565b611e6784848484612222565b611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906137fc565b60405180910390fd5b50505050565b60606000821415611ef4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612054565b600082905060005b60008214611f26578080611f0f90613da8565b915050600a82611f1f9190613c01565b9150611efc565b60008167ffffffffffffffff811115611f68577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f9a5781602001600182028036833780820191505090505b5090505b6000851461204d57600182611fb39190613c8c565b9150600a85611fc29190613df1565b6030611fce9190613bab565b60f81b81838151811061200a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120469190613c01565b9450611f9e565b8093505050505b919050565b600081836120679190613bab565b905092915050565b600081600b5461207f9190613c32565b9050919050565b6120a08282604051806020016040528060008152506123b9565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612119838383612414565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561215c5761215781612419565b61219b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219a576121998382612462565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121de576121d9816125cf565b61221d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221c5761221b8282612712565b5b5b505050565b60006122438473ffffffffffffffffffffffffffffffffffffffff16612791565b156123ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226c6118fd565b8786866040518563ffffffff1660e01b815260040161228e9493929190613753565b602060405180830381600087803b1580156122a857600080fd5b505af19250505080156122d957506040513d601f19601f820116820180604052508101906122d69190612d47565b60015b61235c573d8060008114612309576040519150601f19603f3d011682016040523d82523d6000602084013e61230e565b606091505b50600081511415612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b906137fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b1565b600190505b949350505050565b6123c383836127a4565b6123d06000848484612222565b61240f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612406906137fc565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246f84610c57565b6124799190613c8c565b905060006007600084815260200190815260200160002054905081811461255e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125e39190613c8c565b9050600060096000848152602001908152602001600020549050600060088381548110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612681577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271d83610c57565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280b9061395c565b60405180910390fd5b61281d81611891565b1561285d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128549061383c565b60405180910390fd5b6128696000838361210e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b99190613bab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461297e90613d76565b90600052602060002090601f0160209004810192826129a057600085556129e7565b82601f106129b957805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e65782518255916020019190600101906129cb565b5b5090506129f491906129f8565b5090565b5b80821115612a115760008160009055506001016129f9565b5090565b6000612a28612a2384613b08565b613ad7565b905082815260208101848484011115612a4057600080fd5b612a4b848285613d34565b509392505050565b6000612a66612a6184613b38565b613ad7565b905082815260208101848484011115612a7e57600080fd5b612a89848285613d34565b509392505050565b600081359050612aa081613eef565b92915050565b600081359050612ab581613f06565b92915050565b600081359050612aca81613f1d565b92915050565b600081519050612adf81613f1d565b92915050565b600082601f830112612af657600080fd5b8135612b06848260208601612a15565b91505092915050565b600082601f830112612b2057600080fd5b8135612b30848260208601612a53565b91505092915050565b600081359050612b4881613f34565b92915050565b600060208284031215612b6057600080fd5b6000612b6e84828501612a91565b91505092915050565b60008060408385031215612b8a57600080fd5b6000612b9885828601612a91565b9250506020612ba985828601612a91565b9150509250929050565b600080600060608486031215612bc857600080fd5b6000612bd686828701612a91565b9350506020612be786828701612a91565b9250506040612bf886828701612b39565b9150509250925092565b60008060008060808587031215612c1857600080fd5b6000612c2687828801612a91565b9450506020612c3787828801612a91565b9350506040612c4887828801612b39565b925050606085013567ffffffffffffffff811115612c6557600080fd5b612c7187828801612ae5565b91505092959194509250565b60008060408385031215612c9057600080fd5b6000612c9e85828601612a91565b9250506020612caf85828601612aa6565b9150509250929050565b60008060408385031215612ccc57600080fd5b6000612cda85828601612a91565b9250506020612ceb85828601612b39565b9150509250929050565b600060208284031215612d0757600080fd5b6000612d1584828501612aa6565b91505092915050565b600060208284031215612d3057600080fd5b6000612d3e84828501612abb565b91505092915050565b600060208284031215612d5957600080fd5b6000612d6784828501612ad0565b91505092915050565b600060208284031215612d8257600080fd5b600082013567ffffffffffffffff811115612d9c57600080fd5b612da884828501612b0f565b91505092915050565b600060208284031215612dc357600080fd5b6000612dd184828501612b39565b91505092915050565b612de381613cc0565b82525050565b612df281613cd2565b82525050565b6000612e0382613b68565b612e0d8185613b7e565b9350612e1d818560208601613d43565b612e2681613ede565b840191505092915050565b6000612e3c82613b73565b612e468185613b8f565b9350612e56818560208601613d43565b612e5f81613ede565b840191505092915050565b6000612e7582613b73565b612e7f8185613ba0565b9350612e8f818560208601613d43565b80840191505092915050565b6000612ea8602b83613b8f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f0e603283613b8f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f74602683613b8f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fda601c83613b8f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061301a601683613b8f565b91507f45786365656473206d6178207075726368617365732e000000000000000000006000830152602082019050919050565b600061305a600f83613b8f565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b600061309a602483613b8f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613100601983613b8f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613140602c83613b8f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131a6603883613b8f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061320c602a83613b8f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613272602983613b8f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d8602083613b8f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613318602c83613b8f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061337e600583613ba0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006133be602083613b8f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133fe602983613b8f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613464602f83613b8f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ca601383613b8f565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b600061350a602183613b8f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613570603183613b8f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006135d6601b83613b8f565b91507f496e73756666696369656e74207061796d656e742076616c75652e00000000006000830152602082019050919050565b6000613616602c83613b8f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061367c601c83613b8f565b91507f4578636565647320746f74616c2070657070657220737570706c792e000000006000830152602082019050919050565b60006136bc600183613ba0565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6136f881613d2a565b82525050565b600061370a8285612e6a565b9150613715826136af565b91506137218284612e6a565b915061372c82613371565b91508190509392505050565b600060208201905061374d6000830184612dda565b92915050565b60006080820190506137686000830187612dda565b6137756020830186612dda565b61378260408301856136ef565b81810360608301526137948184612df8565b905095945050505050565b60006020820190506137b46000830184612de9565b92915050565b600060208201905081810360008301526137d48184612e31565b905092915050565b600060208201905081810360008301526137f581612e9b565b9050919050565b6000602082019050818103600083015261381581612f01565b9050919050565b6000602082019050818103600083015261383581612f67565b9050919050565b6000602082019050818103600083015261385581612fcd565b9050919050565b600060208201905081810360008301526138758161300d565b9050919050565b600060208201905081810360008301526138958161304d565b9050919050565b600060208201905081810360008301526138b58161308d565b9050919050565b600060208201905081810360008301526138d5816130f3565b9050919050565b600060208201905081810360008301526138f581613133565b9050919050565b6000602082019050818103600083015261391581613199565b9050919050565b60006020820190508181036000830152613935816131ff565b9050919050565b6000602082019050818103600083015261395581613265565b9050919050565b60006020820190508181036000830152613975816132cb565b9050919050565b600060208201905081810360008301526139958161330b565b9050919050565b600060208201905081810360008301526139b5816133b1565b9050919050565b600060208201905081810360008301526139d5816133f1565b9050919050565b600060208201905081810360008301526139f581613457565b9050919050565b60006020820190508181036000830152613a15816134bd565b9050919050565b60006020820190508181036000830152613a35816134fd565b9050919050565b60006020820190508181036000830152613a5581613563565b9050919050565b60006020820190508181036000830152613a75816135c9565b9050919050565b60006020820190508181036000830152613a9581613609565b9050919050565b60006020820190508181036000830152613ab58161366f565b9050919050565b6000602082019050613ad160008301846136ef565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613afe57613afd613eaf565b5b8060405250919050565b600067ffffffffffffffff821115613b2357613b22613eaf565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b5357613b52613eaf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bb682613d2a565b9150613bc183613d2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bf657613bf5613e22565b5b828201905092915050565b6000613c0c82613d2a565b9150613c1783613d2a565b925082613c2757613c26613e51565b5b828204905092915050565b6000613c3d82613d2a565b9150613c4883613d2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8157613c80613e22565b5b828202905092915050565b6000613c9782613d2a565b9150613ca283613d2a565b925082821015613cb557613cb4613e22565b5b828203905092915050565b6000613ccb82613d0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d61578082015181840152602081019050613d46565b83811115613d70576000848401525b50505050565b60006002820490506001821680613d8e57607f821691505b60208210811415613da257613da1613e80565b5b50919050565b6000613db382613d2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613de657613de5613e22565b5b600182019050919050565b6000613dfc82613d2a565b9150613e0783613d2a565b925082613e1757613e16613e51565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613ef881613cc0565b8114613f0357600080fd5b50565b613f0f81613cd2565b8114613f1a57600080fd5b50565b613f2681613cde565b8114613f3157600080fd5b50565b613f3d81613d2a565b8114613f4857600080fd5b5056fea2646970667358221220193d8d7c3748d5f86b855bcd221b7207395dfa81fa6809fd5350493ff6c9ff4d64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d573147356a7257584159724637683273686e46416976386b51596143463258777a56767a666138435177573700000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmW1G5jrWXAYrF7h2shnFAiv8kQYaCF2XwzVvzfa8CQwW7
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d573147356a7257584159724637683273686e46416976386b51596143
Arg [4] : 463258777a56767a666138435177573700000000000000000000000000000000
Deployed Bytecode Sourcemap
50108:2758:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34644:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23088:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50244:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35284:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23978:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34952:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24388:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35474:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50408:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21223:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50309:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52152:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42447:94;;;;;;;;;;;;;:::i;:::-;;52633:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52738:125;;;:::i;:::-;;52537:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41796:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52424:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21698:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50447:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23381:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24644:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51692:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50194:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42696:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50781:655;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34644:224;34746:4;34785:35;34770:50;;;:11;:50;;;;:90;;;;34824:36;34848:11;34824:23;:36::i;:::-;34770:90;34763:97;;34644:224;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;23088:221::-;23164:7;23192:16;23200:7;23192;:16::i;:::-;23184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23277:15;:24;23293:7;23277:24;;;;;;;;;;;;;;;;;;;;;23270:31;;23088:221;;;:::o;22611:411::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;22750:11;;:2;:11;;;;22742:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22850:5;22834:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22859:37;22876:5;22883:12;:10;:12::i;:::-;22859:16;:37::i;:::-;22834:62;22812:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22993:21;23002:2;23006:7;22993:8;:21::i;:::-;22611:411;;;:::o;50244:58::-;50300:2;50244:58;:::o;35284:113::-;35345:7;35372:10;:17;;;;35365:24;;35284:113;:::o;23978:339::-;24173:41;24192:12;:10;:12::i;:::-;24206:7;24173:18;:41::i;:::-;24165:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24281:28;24291:4;24297:2;24301:7;24281:9;:28::i;:::-;23978:339;;;:::o;34952:256::-;35049:7;35085:23;35102:5;35085:16;:23::i;:::-;35077:5;:31;35069:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35174:12;:19;35187:5;35174:19;;;;;;;;;;;;;;;:26;35194:5;35174:26;;;;;;;;;;;;35167:33;;34952:256;;;;:::o;24388:185::-;24526:39;24543:4;24549:2;24553:7;24526:39;;;;;;;;;;;;:16;:39::i;:::-;24388:185;;;:::o;35474:233::-;35549:7;35585:30;:28;:30::i;:::-;35577:5;:38;35569:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35682:10;35693:5;35682:17;;;;;;;;;;;;;;;;;;;;;;;;35675:24;;35474:233;;;:::o;50408:32::-;;;;;;;;;;;;;:::o;21223:239::-;21295:7;21315:13;21331:7;:16;21339:7;21331:16;;;;;;;;;;;;;;;;;;;;;21315:32;;21383:1;21366:19;;:5;:19;;;;21358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:5;21442:12;;;21223:239;;;:::o;50309:52::-;50358:3;50309:52;:::o;20953:208::-;21025:7;21070:1;21053:19;;:5;:19;;;;21045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:9;:16;21147:5;21137:16;;;;;;;;;;;;;;;;21130:23;;20953:208;;;:::o;52152:104::-;52205:13;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52238:10:::1;:8;:10::i;:::-;52231:17;;52152:104:::0;:::o;42447:94::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42512:21:::1;42530:1;42512:9;:21::i;:::-;42447:94::o:0;52633:97::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52714:8:::1;52699:12;;:23;;;;;;;;;;;;;;;;;;52633:97:::0;:::o;52738:125::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52813:12:::1;:10;:12::i;:::-;52805:26;;:49;52832:21;52805:49;;;;;;;;;;;;;;;;;;;;;;;52797:58;;;::::0;::::1;;52738:125::o:0;52537:88::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52609:8:::1;52601:5;:16;;;;52537:88:::0;:::o;41796:87::-;41842:7;41869:6;;;;;;;;;;;41862:13;;41796:87;:::o;52424:105::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52514:7:::1;52498:13;:23;;;;;;;;;;;;:::i;:::-;;52424:105:::0;:::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21698:104;:::o;50447:40::-;;;;:::o;23381:295::-;23496:12;:10;:12::i;:::-;23484:24;;:8;:24;;;;23476:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23596:8;23551:18;:32;23570:12;:10;:12::i;:::-;23551:32;;;;;;;;;;;;;;;:42;23584:8;23551:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23649:8;23620:48;;23635:12;:10;:12::i;:::-;23620:48;;;23659:8;23620:48;;;;;;:::i;:::-;;;;;;;;23381:295;;:::o;24644:328::-;24819:41;24838:12;:10;:12::i;:::-;24852:7;24819:18;:41::i;:::-;24811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24925:39;24939:4;24945:2;24949:7;24958:5;24925:13;:39::i;:::-;24644:328;;;;:::o;51692:348::-;51765:13;51799:16;51807:7;51799;:16::i;:::-;51791:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51880:21;51904:10;:8;:10::i;:::-;51880:34;;51956:1;51938:7;51932:21;:25;:100;;;;;;;;;;;;;;;;;51984:7;51998:18;:7;:16;:18::i;:::-;51967:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51932:100;51925:107;;;51692:348;;;:::o;50194:43::-;50232:5;50194:43;:::o;23747:164::-;23844:4;23868:18;:25;23887:5;23868:25;;;;;;;;;;;;;;;:35;23894:8;23868:35;;;;;;;;;;;;;;;;;;;;;;;;;23861:42;;23747:164;;;;:::o;42696:192::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42805:1:::1;42785:22;;:8;:22;;;;42777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42861:19;42871:8;42861:9;:19::i;:::-;42696:192:::0;:::o;50781:655::-;50232:5;50706:13;:11;:13::i;:::-;:27;50698:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50888:7:::1;:5;:7::i;:::-;50874:21;;:10;:21;;;50871:96;;50919:12;;;;;;;;;;;50911:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50871:96;50232:5;50985:38;50998:13;:11;:13::i;:::-;51013:9;50985:12;:38::i;:::-;:53;;50977:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;50232:5;51090:13;:11;:13::i;:::-;:27;51082:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50300:2;51156:9;:42;;51148:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;51257:25;51272:9;51257:14;:25::i;:::-;51244:9;:38;;51236:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51331:9;51327:102;51350:9;51346:1;:13;51327:102;;;51381:36;51391:10;51403:13;:11;:13::i;:::-;51381:9;:36::i;:::-;51361:3;;;;;:::i;:::-;;;;51327:102;;;;50781:655:::0;:::o;20584:305::-;20686:4;20738:25;20723:40;;;:11;:40;;;;:105;;;;20795:33;20780:48;;;:11;:48;;;;20723:105;:158;;;;20845:36;20869:11;20845:23;:36::i;:::-;20723:158;20703:178;;20584:305;;;:::o;26482:127::-;26547:4;26599:1;26571:30;;:7;:16;26579:7;26571:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26564:37;;26482:127;;;:::o;15986:98::-;16039:7;16066:10;16059:17;;15986:98;:::o;30464:174::-;30566:2;30539:15;:24;30555:7;30539:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30622:7;30618:2;30584:46;;30593:23;30608:7;30593:14;:23::i;:::-;30584:46;;;;;;;;;;;;30464:174;;:::o;26776:348::-;26869:4;26894:16;26902:7;26894;:16::i;:::-;26886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26970:13;26986:23;27001:7;26986:14;:23::i;:::-;26970:39;;27039:5;27028:16;;:7;:16;;;:51;;;;27072:7;27048:31;;:20;27060:7;27048:11;:20::i;:::-;:31;;;27028:51;:87;;;;27083:32;27100:5;27107:7;27083:16;:32::i;:::-;27028:87;27020:96;;;26776:348;;;;:::o;29768:578::-;29927:4;29900:31;;:23;29915:7;29900:14;:23::i;:::-;:31;;;29892:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30010:1;29996:16;;:2;:16;;;;29988:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30066:39;30087:4;30093:2;30097:7;30066:20;:39::i;:::-;30170:29;30187:1;30191:7;30170:8;:29::i;:::-;30231:1;30212:9;:15;30222:4;30212:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30260:1;30243:9;:13;30253:2;30243:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30291:2;30272:7;:16;30280:7;30272:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30330:7;30326:2;30311:27;;30320:4;30311:27;;;;;;;;;;;;29768:578;;;:::o;51570:114::-;51630:13;51663;51656:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51570:114;:::o;42896:173::-;42952:16;42971:6;;;;;;;;;;;42952:25;;42997:8;42988:6;;:17;;;;;;;;;;;;;;;;;;43052:8;43021:40;;43042:8;43021:40;;;;;;;;;;;;42896:173;;:::o;25854:315::-;26011:28;26021:4;26027:2;26031:7;26011:9;:28::i;:::-;26058:48;26081:4;26087:2;26091:7;26100:5;26058:22;:48::i;:::-;26050:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25854:315;;;;:::o;16519:723::-;16575:13;16805:1;16796:5;:10;16792:53;;;16823:10;;;;;;;;;;;;;;;;;;;;;16792:53;16855:12;16870:5;16855:20;;16886:14;16911:78;16926:1;16918:4;:9;16911:78;;16944:8;;;;;:::i;:::-;;;;16975:2;16967:10;;;;;:::i;:::-;;;16911:78;;;16999:19;17031:6;17021:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16999:39;;17049:154;17065:1;17056:5;:10;17049:154;;17093:1;17083:11;;;;;:::i;:::-;;;17160:2;17152:5;:10;;;;:::i;:::-;17139:2;:24;;;;:::i;:::-;17126:39;;17109:6;17116;17109:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17189:2;17180:11;;;;;:::i;:::-;;;17049:154;;;17227:6;17213:21;;;;;16519:723;;;;:::o;45876:98::-;45934:7;45965:1;45961;:5;;;;:::i;:::-;45954:12;;45876:98;;;;:::o;51444:118::-;51510:7;51545:9;51537:5;;:17;;;;:::i;:::-;51530:24;;51444:118;;;:::o;27466:110::-;27542:26;27552:2;27556:7;27542:26;;;;;;;;;;;;:9;:26::i;:::-;27466:110;;:::o;19082:157::-;19167:4;19206:25;19191:40;;;:11;:40;;;;19184:47;;19082:157;;;:::o;36320:589::-;36464:45;36491:4;36497:2;36501:7;36464:26;:45::i;:::-;36542:1;36526:18;;:4;:18;;;36522:187;;;36561:40;36593:7;36561:31;:40::i;:::-;36522:187;;;36631:2;36623:10;;:4;:10;;;36619:90;;36650:47;36683:4;36689:7;36650:32;:47::i;:::-;36619:90;36522:187;36737:1;36723:16;;:2;:16;;;36719:183;;;36756:45;36793:7;36756:36;:45::i;:::-;36719:183;;;36829:4;36823:10;;:2;:10;;;36819:83;;36850:40;36878:2;36882:7;36850:27;:40::i;:::-;36819:83;36719:183;36320:589;;;:::o;31203:803::-;31358:4;31379:15;:2;:13;;;:15::i;:::-;31375:624;;;31431:2;31415:36;;;31452:12;:10;:12::i;:::-;31466:4;31472:7;31481:5;31415:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31411:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31678:1;31661:6;:13;:18;31657:272;;;31704:60;;;;;;;;;;:::i;:::-;;;;;;;;31657:272;31879:6;31873:13;31864:6;31860:2;31856:15;31849:38;31411:533;31548:45;;;31538:55;;;:6;:55;;;;31531:62;;;;;31375:624;31983:4;31976:11;;31203:803;;;;;;;:::o;27803:321::-;27933:18;27939:2;27943:7;27933:5;:18::i;:::-;27984:54;28015:1;28019:2;28023:7;28032:5;27984:22;:54::i;:::-;27962:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27803:321;;;:::o;32578:126::-;;;;:::o;37632:164::-;37736:10;:17;;;;37709:15;:24;37725:7;37709:24;;;;;;;;;;;:44;;;;37764:10;37780:7;37764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37632:164;:::o;38423:988::-;38689:22;38739:1;38714:22;38731:4;38714:16;:22::i;:::-;:26;;;;:::i;:::-;38689:51;;38751:18;38772:17;:26;38790:7;38772:26;;;;;;;;;;;;38751:47;;38919:14;38905:10;:28;38901:328;;38950:19;38972:12;:18;38985:4;38972:18;;;;;;;;;;;;;;;:34;38991:14;38972:34;;;;;;;;;;;;38950:56;;39056:11;39023:12;:18;39036:4;39023:18;;;;;;;;;;;;;;;:30;39042:10;39023:30;;;;;;;;;;;:44;;;;39173:10;39140:17;:30;39158:11;39140:30;;;;;;;;;;;:43;;;;38901:328;;39325:17;:26;39343:7;39325:26;;;;;;;;;;;39318:33;;;39369:12;:18;39382:4;39369:18;;;;;;;;;;;;;;;:34;39388:14;39369:34;;;;;;;;;;;39362:41;;;38423:988;;;;:::o;39706:1079::-;39959:22;40004:1;39984:10;:17;;;;:21;;;;:::i;:::-;39959:46;;40016:18;40037:15;:24;40053:7;40037:24;;;;;;;;;;;;40016:45;;40388:19;40410:10;40421:14;40410:26;;;;;;;;;;;;;;;;;;;;;;;;40388:48;;40474:11;40449:10;40460;40449:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40585:10;40554:15;:28;40570:11;40554:28;;;;;;;;;;;:41;;;;40726:15;:24;40742:7;40726:24;;;;;;;;;;;40719:31;;;40761:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39706:1079;;;;:::o;37210:221::-;37295:14;37312:20;37329:2;37312:16;:20::i;:::-;37295:37;;37370:7;37343:12;:16;37356:2;37343:16;;;;;;;;;;;;;;;:24;37360:6;37343:24;;;;;;;;;;;:34;;;;37417:6;37388:17;:26;37406:7;37388:26;;;;;;;;;;;:35;;;;37210:221;;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;28460:382::-;28554:1;28540:16;;:2;:16;;;;28532:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28613:16;28621:7;28613;:16::i;:::-;28612:17;28604:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28675:45;28704:1;28708:2;28712:7;28675:20;:45::i;:::-;28750:1;28733:9;:13;28743:2;28733:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28781:2;28762:7;:16;28770:7;28762:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28826:7;28822:2;28801:33;;28818:1;28801:33;;;;;;;;;;;;28460:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:118::-;6433:24;6451:5;6433:24;:::i;:::-;6428:3;6421:37;6411:53;;:::o;6470:109::-;6551:21;6566:5;6551:21;:::i;:::-;6546:3;6539:34;6529:50;;:::o;6585:360::-;;6699:38;6731:5;6699:38;:::i;:::-;6753:70;6816:6;6811:3;6753:70;:::i;:::-;6746:77;;6832:52;6877:6;6872:3;6865:4;6858:5;6854:16;6832:52;:::i;:::-;6909:29;6931:6;6909:29;:::i;:::-;6904:3;6900:39;6893:46;;6675:270;;;;;:::o;6951:364::-;;7067:39;7100:5;7067:39;:::i;:::-;7122:71;7186:6;7181:3;7122:71;:::i;:::-;7115:78;;7202:52;7247:6;7242:3;7235:4;7228:5;7224:16;7202:52;:::i;:::-;7279:29;7301:6;7279:29;:::i;:::-;7274:3;7270:39;7263:46;;7043:272;;;;;:::o;7321:377::-;;7455:39;7488:5;7455:39;:::i;:::-;7510:89;7592:6;7587:3;7510:89;:::i;:::-;7503:96;;7608:52;7653:6;7648:3;7641:4;7634:5;7630:16;7608:52;:::i;:::-;7685:6;7680:3;7676:16;7669:23;;7431:267;;;;;:::o;7704:375::-;;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7964:34;7960:1;7955:3;7951:11;7944:55;8030:13;8025:2;8020:3;8016:12;8009:35;8070:2;8065:3;8061:12;8054:19;;7850:229;;;:::o;8085:382::-;;8248:67;8312:2;8307:3;8248:67;:::i;:::-;8241:74;;8345:34;8341:1;8336:3;8332:11;8325:55;8411:20;8406:2;8401:3;8397:12;8390:42;8458:2;8453:3;8449:12;8442:19;;8231:236;;;:::o;8473:370::-;;8636:67;8700:2;8695:3;8636:67;:::i;:::-;8629:74;;8733:34;8729:1;8724:3;8720:11;8713:55;8799:8;8794:2;8789:3;8785:12;8778:30;8834:2;8829:3;8825:12;8818:19;;8619:224;;;:::o;8849:326::-;;9012:67;9076:2;9071:3;9012:67;:::i;:::-;9005:74;;9109:30;9105:1;9100:3;9096:11;9089:51;9166:2;9161:3;9157:12;9150:19;;8995:180;;;:::o;9181:320::-;;9344:67;9408:2;9403:3;9344:67;:::i;:::-;9337:74;;9441:24;9437:1;9432:3;9428:11;9421:45;9492:2;9487:3;9483:12;9476:19;;9327:174;;;:::o;9507:313::-;;9670:67;9734:2;9729:3;9670:67;:::i;:::-;9663:74;;9767:17;9763:1;9758:3;9754:11;9747:38;9811:2;9806:3;9802:12;9795:19;;9653:167;;;:::o;9826:368::-;;9989:67;10053:2;10048:3;9989:67;:::i;:::-;9982:74;;10086:34;10082:1;10077:3;10073:11;10066:55;10152:6;10147:2;10142:3;10138:12;10131:28;10185:2;10180:3;10176:12;10169:19;;9972:222;;;:::o;10200:323::-;;10363:67;10427:2;10422:3;10363:67;:::i;:::-;10356:74;;10460:27;10456:1;10451:3;10447:11;10440:48;10514:2;10509:3;10505:12;10498:19;;10346:177;;;:::o;10529:376::-;;10692:67;10756:2;10751:3;10692:67;:::i;:::-;10685:74;;10789:34;10785:1;10780:3;10776:11;10769:55;10855:14;10850:2;10845:3;10841:12;10834:36;10896:2;10891:3;10887:12;10880:19;;10675:230;;;:::o;10911:388::-;;11074:67;11138:2;11133:3;11074:67;:::i;:::-;11067:74;;11171:34;11167:1;11162:3;11158:11;11151:55;11237:26;11232:2;11227:3;11223:12;11216:48;11290:2;11285:3;11281:12;11274:19;;11057:242;;;:::o;11305:374::-;;11468:67;11532:2;11527:3;11468:67;:::i;:::-;11461:74;;11565:34;11561:1;11556:3;11552:11;11545:55;11631:12;11626:2;11621:3;11617:12;11610:34;11670:2;11665:3;11661:12;11654:19;;11451:228;;;:::o;11685:373::-;;11848:67;11912:2;11907:3;11848:67;:::i;:::-;11841:74;;11945:34;11941:1;11936:3;11932:11;11925:55;12011:11;12006:2;12001:3;11997:12;11990:33;12049:2;12044:3;12040:12;12033:19;;11831:227;;;:::o;12064:330::-;;12227:67;12291:2;12286:3;12227:67;:::i;:::-;12220:74;;12324:34;12320:1;12315:3;12311:11;12304:55;12385:2;12380:3;12376:12;12369:19;;12210:184;;;:::o;12400:376::-;;12563:67;12627:2;12622:3;12563:67;:::i;:::-;12556:74;;12660:34;12656:1;12651:3;12647:11;12640:55;12726:14;12721:2;12716:3;12712:12;12705:36;12767:2;12762:3;12758:12;12751:19;;12546:230;;;:::o;12782:337::-;;12963:84;13045:1;13040:3;12963:84;:::i;:::-;12956:91;;13077:7;13073:1;13068:3;13064:11;13057:28;13111:1;13106:3;13102:11;13095:18;;12946:173;;;:::o;13125:330::-;;13288:67;13352:2;13347:3;13288:67;:::i;:::-;13281:74;;13385:34;13381:1;13376:3;13372:11;13365:55;13446:2;13441:3;13437:12;13430:19;;13271:184;;;:::o;13461:373::-;;13624:67;13688:2;13683:3;13624:67;:::i;:::-;13617:74;;13721:34;13717:1;13712:3;13708:11;13701:55;13787:11;13782:2;13777:3;13773:12;13766:33;13825:2;13820:3;13816:12;13809:19;;13607:227;;;:::o;13840:379::-;;14003:67;14067:2;14062:3;14003:67;:::i;:::-;13996:74;;14100:34;14096:1;14091:3;14087:11;14080:55;14166:17;14161:2;14156:3;14152:12;14145:39;14210:2;14205:3;14201:12;14194:19;;13986:233;;;:::o;14225:317::-;;14388:67;14452:2;14447:3;14388:67;:::i;:::-;14381:74;;14485:21;14481:1;14476:3;14472:11;14465:42;14533:2;14528:3;14524:12;14517:19;;14371:171;;;:::o;14548:365::-;;14711:67;14775:2;14770:3;14711:67;:::i;:::-;14704:74;;14808:34;14804:1;14799:3;14795:11;14788:55;14874:3;14869:2;14864:3;14860:12;14853:25;14904:2;14899:3;14895:12;14888:19;;14694:219;;;:::o;14919:381::-;;15082:67;15146:2;15141:3;15082:67;:::i;:::-;15075:74;;15179:34;15175:1;15170:3;15166:11;15159:55;15245:19;15240:2;15235:3;15231:12;15224:41;15291:2;15286:3;15282:12;15275:19;;15065:235;;;:::o;15306:325::-;;15469:67;15533:2;15528:3;15469:67;:::i;:::-;15462:74;;15566:29;15562:1;15557:3;15553:11;15546:50;15622:2;15617:3;15613:12;15606:19;;15452:179;;;:::o;15637:376::-;;15800:67;15864:2;15859:3;15800:67;:::i;:::-;15793:74;;15897:34;15893:1;15888:3;15884:11;15877:55;15963:14;15958:2;15953:3;15949:12;15942:36;16004:2;15999:3;15995:12;15988:19;;15783:230;;;:::o;16019:326::-;;16182:67;16246:2;16241:3;16182:67;:::i;:::-;16175:74;;16279:30;16275:1;16270:3;16266:11;16259:51;16336:2;16331:3;16327:12;16320:19;;16165:180;;;:::o;16351:333::-;;16532:84;16614:1;16609:3;16532:84;:::i;:::-;16525:91;;16646:3;16642:1;16637:3;16633:11;16626:24;16676:1;16671:3;16667:11;16660:18;;16515:169;;;:::o;16690:118::-;16777:24;16795:5;16777:24;:::i;:::-;16772:3;16765:37;16755:53;;:::o;16814:967::-;;17218:95;17309:3;17300:6;17218:95;:::i;:::-;17211:102;;17330:148;17474:3;17330:148;:::i;:::-;17323:155;;17495:95;17586:3;17577:6;17495:95;:::i;:::-;17488:102;;17607:148;17751:3;17607:148;:::i;:::-;17600:155;;17772:3;17765:10;;17200:581;;;;;:::o;17787:222::-;;17918:2;17907:9;17903:18;17895:26;;17931:71;17999:1;17988:9;17984:17;17975:6;17931:71;:::i;:::-;17885:124;;;;:::o;18015:640::-;;18248:3;18237:9;18233:19;18225:27;;18262:71;18330:1;18319:9;18315:17;18306:6;18262:71;:::i;:::-;18343:72;18411:2;18400:9;18396:18;18387:6;18343:72;:::i;:::-;18425;18493:2;18482:9;18478:18;18469:6;18425:72;:::i;:::-;18544:9;18538:4;18534:20;18529:2;18518:9;18514:18;18507:48;18572:76;18643:4;18634:6;18572:76;:::i;:::-;18564:84;;18215:440;;;;;;;:::o;18661:210::-;;18786:2;18775:9;18771:18;18763:26;;18799:65;18861:1;18850:9;18846:17;18837:6;18799:65;:::i;:::-;18753:118;;;;:::o;18877:313::-;;19028:2;19017:9;19013:18;19005:26;;19077:9;19071:4;19067:20;19063:1;19052:9;19048:17;19041:47;19105:78;19178:4;19169:6;19105:78;:::i;:::-;19097:86;;18995:195;;;;:::o;19196:419::-;;19400:2;19389:9;19385:18;19377:26;;19449:9;19443:4;19439:20;19435:1;19424:9;19420:17;19413:47;19477:131;19603:4;19477:131;:::i;:::-;19469:139;;19367:248;;;:::o;19621:419::-;;19825:2;19814:9;19810:18;19802:26;;19874:9;19868:4;19864:20;19860:1;19849:9;19845:17;19838:47;19902:131;20028:4;19902:131;:::i;:::-;19894:139;;19792:248;;;:::o;20046:419::-;;20250:2;20239:9;20235:18;20227:26;;20299:9;20293:4;20289:20;20285:1;20274:9;20270:17;20263:47;20327:131;20453:4;20327:131;:::i;:::-;20319:139;;20217:248;;;:::o;20471:419::-;;20675:2;20664:9;20660:18;20652:26;;20724:9;20718:4;20714:20;20710:1;20699:9;20695:17;20688:47;20752:131;20878:4;20752:131;:::i;:::-;20744:139;;20642:248;;;:::o;20896:419::-;;21100:2;21089:9;21085:18;21077:26;;21149:9;21143:4;21139:20;21135:1;21124:9;21120:17;21113:47;21177:131;21303:4;21177:131;:::i;:::-;21169:139;;21067:248;;;:::o;21321:419::-;;21525:2;21514:9;21510:18;21502:26;;21574:9;21568:4;21564:20;21560:1;21549:9;21545:17;21538:47;21602:131;21728:4;21602:131;:::i;:::-;21594:139;;21492:248;;;:::o;21746:419::-;;21950:2;21939:9;21935:18;21927:26;;21999:9;21993:4;21989:20;21985:1;21974:9;21970:17;21963:47;22027:131;22153:4;22027:131;:::i;:::-;22019:139;;21917:248;;;:::o;22171:419::-;;22375:2;22364:9;22360:18;22352:26;;22424:9;22418:4;22414:20;22410:1;22399:9;22395:17;22388:47;22452:131;22578:4;22452:131;:::i;:::-;22444:139;;22342:248;;;:::o;22596:419::-;;22800:2;22789:9;22785:18;22777:26;;22849:9;22843:4;22839:20;22835:1;22824:9;22820:17;22813:47;22877:131;23003:4;22877:131;:::i;:::-;22869:139;;22767:248;;;:::o;23021:419::-;;23225:2;23214:9;23210:18;23202:26;;23274:9;23268:4;23264:20;23260:1;23249:9;23245:17;23238:47;23302:131;23428:4;23302:131;:::i;:::-;23294:139;;23192:248;;;:::o;23446:419::-;;23650:2;23639:9;23635:18;23627:26;;23699:9;23693:4;23689:20;23685:1;23674:9;23670:17;23663:47;23727:131;23853:4;23727:131;:::i;:::-;23719:139;;23617:248;;;:::o;23871:419::-;;24075:2;24064:9;24060:18;24052:26;;24124:9;24118:4;24114:20;24110:1;24099:9;24095:17;24088:47;24152:131;24278:4;24152:131;:::i;:::-;24144:139;;24042:248;;;:::o;24296:419::-;;24500:2;24489:9;24485:18;24477:26;;24549:9;24543:4;24539:20;24535:1;24524:9;24520:17;24513:47;24577:131;24703:4;24577:131;:::i;:::-;24569:139;;24467:248;;;:::o;24721:419::-;;24925:2;24914:9;24910:18;24902:26;;24974:9;24968:4;24964:20;24960:1;24949:9;24945:17;24938:47;25002:131;25128:4;25002:131;:::i;:::-;24994:139;;24892:248;;;:::o;25146:419::-;;25350:2;25339:9;25335:18;25327:26;;25399:9;25393:4;25389:20;25385:1;25374:9;25370:17;25363:47;25427:131;25553:4;25427:131;:::i;:::-;25419:139;;25317:248;;;:::o;25571:419::-;;25775:2;25764:9;25760:18;25752:26;;25824:9;25818:4;25814:20;25810:1;25799:9;25795:17;25788:47;25852:131;25978:4;25852:131;:::i;:::-;25844:139;;25742:248;;;:::o;25996:419::-;;26200:2;26189:9;26185:18;26177:26;;26249:9;26243:4;26239:20;26235:1;26224:9;26220:17;26213:47;26277:131;26403:4;26277:131;:::i;:::-;26269:139;;26167:248;;;:::o;26421:419::-;;26625:2;26614:9;26610:18;26602:26;;26674:9;26668:4;26664:20;26660:1;26649:9;26645:17;26638:47;26702:131;26828:4;26702:131;:::i;:::-;26694:139;;26592:248;;;:::o;26846:419::-;;27050:2;27039:9;27035:18;27027:26;;27099:9;27093:4;27089:20;27085:1;27074:9;27070:17;27063:47;27127:131;27253:4;27127:131;:::i;:::-;27119:139;;27017:248;;;:::o;27271:419::-;;27475:2;27464:9;27460:18;27452:26;;27524:9;27518:4;27514:20;27510:1;27499:9;27495:17;27488:47;27552:131;27678:4;27552:131;:::i;:::-;27544:139;;27442:248;;;:::o;27696:419::-;;27900:2;27889:9;27885:18;27877:26;;27949:9;27943:4;27939:20;27935:1;27924:9;27920:17;27913:47;27977:131;28103:4;27977:131;:::i;:::-;27969:139;;27867:248;;;:::o;28121:419::-;;28325:2;28314:9;28310:18;28302:26;;28374:9;28368:4;28364:20;28360:1;28349:9;28345:17;28338:47;28402:131;28528:4;28402:131;:::i;:::-;28394:139;;28292:248;;;:::o;28546:419::-;;28750:2;28739:9;28735:18;28727:26;;28799:9;28793:4;28789:20;28785:1;28774:9;28770:17;28763:47;28827:131;28953:4;28827:131;:::i;:::-;28819:139;;28717:248;;;:::o;28971:222::-;;29102:2;29091:9;29087:18;29079:26;;29115:71;29183:1;29172:9;29168:17;29159:6;29115:71;:::i;:::-;29069:124;;;;:::o;29199:283::-;;29265:2;29259:9;29249:19;;29307:4;29299:6;29295:17;29414:6;29402:10;29399:22;29378:18;29366:10;29363:34;29360:62;29357:2;;;29425:18;;:::i;:::-;29357:2;29465:10;29461:2;29454:22;29239:243;;;;:::o;29488:331::-;;29639:18;29631:6;29628:30;29625:2;;;29661:18;;:::i;:::-;29625:2;29746:4;29742:9;29735:4;29727:6;29723:17;29719:33;29711:41;;29807:4;29801;29797:15;29789:23;;29554:265;;;:::o;29825:332::-;;29977:18;29969:6;29966:30;29963:2;;;29999:18;;:::i;:::-;29963:2;30084:4;30080:9;30073:4;30065:6;30061:17;30057:33;30049:41;;30145:4;30139;30135:15;30127:23;;29892:265;;;:::o;30163:98::-;;30248:5;30242:12;30232:22;;30221:40;;;:::o;30267:99::-;;30353:5;30347:12;30337:22;;30326:40;;;:::o;30372:168::-;;30489:6;30484:3;30477:19;30529:4;30524:3;30520:14;30505:29;;30467:73;;;;:::o;30546:169::-;;30664:6;30659:3;30652:19;30704:4;30699:3;30695:14;30680:29;;30642:73;;;;:::o;30721:148::-;;30860:3;30845:18;;30835:34;;;;:::o;30875:305::-;;30934:20;30952:1;30934:20;:::i;:::-;30929:25;;30968:20;30986:1;30968:20;:::i;:::-;30963:25;;31122:1;31054:66;31050:74;31047:1;31044:81;31041:2;;;31128:18;;:::i;:::-;31041:2;31172:1;31169;31165:9;31158:16;;30919:261;;;;:::o;31186:185::-;;31243:20;31261:1;31243:20;:::i;:::-;31238:25;;31277:20;31295:1;31277:20;:::i;:::-;31272:25;;31316:1;31306:2;;31321:18;;:::i;:::-;31306:2;31363:1;31360;31356:9;31351:14;;31228:143;;;;:::o;31377:348::-;;31440:20;31458:1;31440:20;:::i;:::-;31435:25;;31474:20;31492:1;31474:20;:::i;:::-;31469:25;;31662:1;31594:66;31590:74;31587:1;31584:81;31579:1;31572:9;31565:17;31561:105;31558:2;;;31669:18;;:::i;:::-;31558:2;31717:1;31714;31710:9;31699:20;;31425:300;;;;:::o;31731:191::-;;31791:20;31809:1;31791:20;:::i;:::-;31786:25;;31825:20;31843:1;31825:20;:::i;:::-;31820:25;;31864:1;31861;31858:8;31855:2;;;31869:18;;:::i;:::-;31855:2;31914:1;31911;31907:9;31899:17;;31776:146;;;;:::o;31928:96::-;;31994:24;32012:5;31994:24;:::i;:::-;31983:35;;31973:51;;;:::o;32030:90::-;;32107:5;32100:13;32093:21;32082:32;;32072:48;;;:::o;32126:149::-;;32202:66;32195:5;32191:78;32180:89;;32170:105;;;:::o;32281:126::-;;32358:42;32351:5;32347:54;32336:65;;32326:81;;;:::o;32413:77::-;;32479:5;32468:16;;32458:32;;;:::o;32496:154::-;32580:6;32575:3;32570;32557:30;32642:1;32633:6;32628:3;32624:16;32617:27;32547:103;;;:::o;32656:307::-;32724:1;32734:113;32748:6;32745:1;32742:13;32734:113;;;32833:1;32828:3;32824:11;32818:18;32814:1;32809:3;32805:11;32798:39;32770:2;32767:1;32763:10;32758:15;;32734:113;;;32865:6;32862:1;32859:13;32856:2;;;32945:1;32936:6;32931:3;32927:16;32920:27;32856:2;32705:258;;;;:::o;32969:320::-;;33050:1;33044:4;33040:12;33030:22;;33097:1;33091:4;33087:12;33118:18;33108:2;;33174:4;33166:6;33162:17;33152:27;;33108:2;33236;33228:6;33225:14;33205:18;33202:38;33199:2;;;33255:18;;:::i;:::-;33199:2;33020:269;;;;:::o;33295:233::-;;33357:24;33375:5;33357:24;:::i;:::-;33348:33;;33403:66;33396:5;33393:77;33390:2;;;33473:18;;:::i;:::-;33390:2;33520:1;33513:5;33509:13;33502:20;;33338:190;;;:::o;33534:176::-;;33583:20;33601:1;33583:20;:::i;:::-;33578:25;;33617:20;33635:1;33617:20;:::i;:::-;33612:25;;33656:1;33646:2;;33661:18;;:::i;:::-;33646:2;33702:1;33699;33695:9;33690:14;;33568:142;;;;:::o;33716:180::-;33764:77;33761:1;33754:88;33861:4;33858:1;33851:15;33885:4;33882:1;33875:15;33902:180;33950:77;33947:1;33940:88;34047:4;34044:1;34037:15;34071:4;34068:1;34061:15;34088:180;34136:77;34133:1;34126:88;34233:4;34230:1;34223:15;34257:4;34254:1;34247:15;34274:180;34322:77;34319:1;34312:88;34419:4;34416:1;34409:15;34443:4;34440:1;34433:15;34460:102;;34552:2;34548:7;34543:2;34536:5;34532:14;34528:28;34518:38;;34508:54;;;:::o;34568:122::-;34641:24;34659:5;34641:24;:::i;:::-;34634:5;34631:35;34621:2;;34680:1;34677;34670:12;34621:2;34611:79;:::o;34696:116::-;34766:21;34781:5;34766:21;:::i;:::-;34759:5;34756:32;34746:2;;34802:1;34799;34792:12;34746:2;34736:76;:::o;34818:120::-;34890:23;34907:5;34890:23;:::i;:::-;34883:5;34880:34;34870:2;;34928:1;34925;34918:12;34870:2;34860:78;:::o;34944:122::-;35017:24;35035:5;35017:24;:::i;:::-;35010:5;35007:35;34997:2;;35056:1;35053;35046:12;34997:2;34987:79;:::o
Swarm Source
ipfs://193d8d7c3748d5f86b855bcd221b7207395dfa81fa6809fd5350493ff6c9ff4d
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.