Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
372 GAS
Holders
194
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GASLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GrownAS
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-18 */ /** *Submitted for verification at Etherscan.io on 2022-01-08 */ /** *Submitted for verification at Etherscan.io on 2021-10-13 */ // SPDX-License-Identifier: MIT 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; } } } /** * @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); } } /** * @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); } } } } /** * @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); } /** * @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.m * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @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; } } /** * @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; } /** * @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); } /** * @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); } /* * @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; } } /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _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); } } /** * @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; string public _baseURI; /** * @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 base = baseURI(); string memory baseExtension = ".json"; return bytes(base).length > 0 ? string(abi.encodePacked(base, tokenId.toString(), baseExtension)) : ""; } /** * @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 _baseURI; } /** * @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 {} } /** * @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(); } } contract DoodleAS { function tokensOfOwner(address _owner) public view returns (uint256[] memory){} } contract GrownAS is ERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using Strings for uint256; address dasAddress = 0x0e099d20e5f8fAD56C3BDb18Fe499Bc958248251; DoodleAS das = DoodleAS(dasAddress); uint public constant _TOTALSUPPLY = 5000; uint256 public price = 25000000000000000; // 0.025 ETH bool public isPaused = true; bool public presale = true; mapping(address => uint32) freeMintedCount; constructor(string memory baseURI) ERC721("Grown Apes Society", "GAS") { setBaseURI(baseURI); } function mint(address _to, uint256 quantity) public payable isSaleOpen { require(isPaused == false, "Sale is not active at the moment"); require(_to != address(0), "Mint to the zero address"); uint256 maxquantity = 5; uint256 temp_price = price; if (presale == true) { uint256[] memory result = das.tokensOfOwner(msg.sender); maxquantity = result.length - freeMintedCount[msg.sender]; require( result.length > freeMintedCount[msg.sender], "NO DAS TOKENS"); temp_price = 0; } require(quantity <= maxquantity, "Exceed max quantity"); uint256 tokenId = totalSupply(); require(temp_price * quantity <= msg.value, "Wrong amount sent"); for (uint256 i = 0; i < quantity; i++) { tokenId++; _safeMint(_to, tokenId); } if (presale == true) { freeMintedCount[msg.sender] += uint32(quantity); } } function DAScountofOwner(address _owner) public view returns (uint256) { uint256[] memory result = das.tokensOfOwner(_owner); return result.length; } function setBaseURI(string memory baseURI) public onlyOwner { _baseURI = baseURI; } function flipPauseStatus() public onlyOwner { isPaused = !isPaused; } function flipPresaleStatus() public onlyOwner { presale = !presale; } function setPrice(uint256 _newPrice) public onlyOwner() { price = _newPrice; } function mintByOwner(address _to, uint256 quantity) public onlyOwner{ require(_to != address(0), "Mint to the zero address"); uint256 tokenId = totalSupply(); for (uint256 i = 0; i < quantity; i++) { _safeMint(_to, tokenId); tokenId++; } } modifier isSaleOpen{ require(totalSupply() < _TOTALSUPPLY, "Mint wourd exceed totalSupply"); _; } function tokensOfOwner(address _owner) public view returns (uint256[] memory) { uint256 count = balanceOf(_owner); uint256[] memory result = new uint256[](count); for (uint256 index = 0; index < count; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"DAScountofOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTALSUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","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":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052730e099d20e5f8fad56c3bdb18fe499bc958248251600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506658d15e17628000600e556001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055503480156200010a57600080fd5b5060405162004f2138038062004f21833981810160405281019062000130919062000498565b6040518060400160405280601281526020017f47726f776e204170657320536f636965747900000000000000000000000000008152506040518060400160405280600381526020017f47415300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001b492919062000376565b508060019080519060200190620001cd92919062000376565b5050506000620001e26200029960201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200029281620002a160201b60201c565b5062000683565b600033905090565b620002b16200029960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d76200034c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000327906200051f565b60405180910390fd5b80600690805190602001906200034892919062000376565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038490620005ef565b90600052602060002090601f016020900481019282620003a85760008555620003f4565b82601f10620003c357805160ff1916838001178555620003f4565b82800160010185558215620003f4579182015b82811115620003f3578251825591602001919060010190620003d6565b5b50905062000403919062000407565b5090565b5b808211156200042257600081600090555060010162000408565b5090565b60006200043d620004378462000575565b62000541565b9050828152602081018484840111156200045657600080fd5b62000463848285620005b9565b509392505050565b600082601f8301126200047d57600080fd5b81516200048f84826020860162000426565b91505092915050565b600060208284031215620004ab57600080fd5b600082015167ffffffffffffffff811115620004c657600080fd5b620004d4848285016200046b565b91505092915050565b6000620004ec602083620005a8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200053a81620004dd565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200056b576200056a62000654565b5b8060405250919050565b600067ffffffffffffffff82111562000593576200059262000654565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b83811015620005d9578082015181840152602081019050620005bc565b83811115620005e9576000848401525b50505050565b600060028204905060018216806200060857607f821691505b602082108114156200061f576200061e62000625565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61488e80620006936000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063a260531b116100a0578063db4568e21161006f578063db4568e2146106ee578063e985e9c514610719578063f2fde38b14610756578063fa62884c1461077f578063fdea8e0b14610796576101ee565b8063a260531b14610620578063b187bd261461065d578063b88d4fde14610688578063c87b56dd146106b1576101ee565b806391b7f5ed116100dc57806391b7f5ed1461057857806395d89b41146105a1578063a035b1fe146105cc578063a22cb465146105f7576101ee565b8063715018a6146104ce578063743976a0146104e55780638462151c146105105780638da5cb5b1461054d576101ee565b80633542aee2116101855780634f6ccce7116101545780634f6ccce7146103ee57806355f804b31461042b5780636352211e1461045457806370a0823114610491576101ee565b80633542aee2146103695780633ccfd60b1461039257806340c10f19146103a957806342842e0e146103c5576101ee565b80631725051f116101c15780631725051f146102c157806318160ddd146102d857806323b872dd146103035780632f745c591461032c576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906134fe565b6107c1565b6040516102279190613fdd565b60405180910390f35b34801561023c57600080fd5b5061024561083b565b6040516102529190613ff8565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613591565b6108cd565b60405161028f9190613f54565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613481565b610952565b005b3480156102cd57600080fd5b506102d6610a6a565b005b3480156102e457600080fd5b506102ed610b12565b6040516102fa919061431a565b60405180910390f35b34801561030f57600080fd5b5061032a6004803603810190610325919061337b565b610b1f565b005b34801561033857600080fd5b50610353600480360381019061034e9190613481565b610b7f565b604051610360919061431a565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190613481565b610c24565b005b34801561039e57600080fd5b506103a7610d58565b005b6103c360048036038101906103be9190613481565b610e23565b005b3480156103d157600080fd5b506103ec60048036038101906103e7919061337b565b611287565b005b3480156103fa57600080fd5b5061041560048036038101906104109190613591565b6112a7565b604051610422919061431a565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613550565b61133e565b005b34801561046057600080fd5b5061047b60048036038101906104769190613591565b6113d4565b6040516104889190613f54565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613316565b611486565b6040516104c5919061431a565b60405180910390f35b3480156104da57600080fd5b506104e361153e565b005b3480156104f157600080fd5b506104fa611643565b6040516105079190613ff8565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613316565b6116d1565b6040516105449190613fbb565b60405180910390f35b34801561055957600080fd5b506105626117cb565b60405161056f9190613f54565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613591565b6117f5565b005b3480156105ad57600080fd5b506105b661187b565b6040516105c39190613ff8565b60405180910390f35b3480156105d857600080fd5b506105e161190d565b6040516105ee919061431a565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190613445565b611913565b005b34801561062c57600080fd5b5061064760048036038101906106429190613316565b611a94565b604051610654919061431a565b60405180910390f35b34801561066957600080fd5b50610672611b53565b60405161067f9190613fdd565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa91906133ca565b611b66565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190613591565b611bc8565b6040516106e59190613ff8565b60405180910390f35b3480156106fa57600080fd5b50610703611cac565b604051610710919061431a565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b919061333f565b611cb2565b60405161074d9190613fdd565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190613316565b611d46565b005b34801561078b57600080fd5b50610794611e3e565b005b3480156107a257600080fd5b506107ab611ee6565b6040516107b89190613fdd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610834575061083382611ef9565b5b9050919050565b60606000805461084a90614683565b80601f016020809104026020016040519081016040528092919081815260200182805461087690614683565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611fdb565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906141da565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d826113d4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c59061427a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed612047565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16612047565b611cb2565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529061415a565b60405180910390fd5b610a65838361204f565b505050565b610a72612047565b73ffffffffffffffffffffffffffffffffffffffff16610a906117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add906141fa565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000600980549050905090565b610b30610b2a612047565b82612108565b610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061429a565b60405180910390fd5b610b7a8383836121e6565b505050565b6000610b8a83611486565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061405a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c2c612047565b73ffffffffffffffffffffffffffffffffffffffff16610c4a6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c97906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906142da565b60405180910390fd5b6000610d1a610b12565b905060005b82811015610d5257610d318483612442565b8180610d3c906146b5565b9250508080610d4a906146b5565b915050610d1f565b50505050565b610d60612047565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb906141fa565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e1f573d6000803e3d6000fd5b5050565b611388610e2e610b12565b10610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e659061401a565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb906142fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b906142da565b60405180910390fd5b6000600590506000600e54905060011515600f60019054906101000a900460ff1615151415611113576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b8152600401610fba9190613f54565b60006040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100f91906134bd565b9050601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1681516110739190614589565b9250601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1681511161110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906140da565b60405180910390fd5b60009150505b81831115611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d9061403a565b60405180910390fd5b6000611160610b12565b905034848361116f919061452f565b11156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a79061425a565b60405180910390fd5b60005b848110156111e65781806111c6906146b5565b9250506111d38683612442565b80806111de906146b5565b9150506111b3565b5060011515600f60019054906101000a900460ff16151514156112805783601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900463ffffffff1661126191906144c4565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b5050505050565b6112a283838360405180602001604052806000815250611b66565b505050565b60006112b1610b12565b82106112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e9906142ba565b60405180910390fd5b6009828154811061132c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611346612047565b73ffffffffffffffffffffffffffffffffffffffff166113646117cb565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906141fa565b60405180910390fd5b80600690805190602001906113d092919061308f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561147d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114749061419a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061417a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611546612047565b73ffffffffffffffffffffffffffffffffffffffff166115646117cb565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b1906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36116416000612460565b565b6006805461165090614683565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614683565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b505050505081565b606060006116de83611486565b905060008167ffffffffffffffff811115611722577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117505781602001602082028036833780820191505090505b50905060005b828110156117c0576117688582610b7f565b8282815181106117a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806117b8906146b5565b915050611756565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117fd612047565b73ffffffffffffffffffffffffffffffffffffffff1661181b6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906141fa565b60405180910390fd5b80600e8190555050565b60606001805461188a90614683565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614683565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b600e5481565b61191b612047565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119809061411a565b60405180910390fd5b8060056000611996612047565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a43612047565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190613fdd565b60405180910390a35050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b8152600401611af29190613f54565b60006040518083038186803b158015611b0a57600080fd5b505afa158015611b1e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b4791906134bd565b90508051915050919050565b600f60009054906101000a900460ff1681565b611b77611b71612047565b83612108565b611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061429a565b60405180910390fd5b611bc284848484612526565b50505050565b6060611bd382611fdb565b611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061423a565b60405180910390fd5b6000611c1c612582565b905060006040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525090506000825111611c765760405180602001604052806000815250611ca3565b81611c8085612614565b82604051602001611c9393929190613f23565b6040516020818303038152906040525b92505050919050565b61138881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4e612047565b73ffffffffffffffffffffffffffffffffffffffff16611d6c6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db9906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e299061409a565b60405180910390fd5b611e3b81612460565b50565b611e46612047565b73ffffffffffffffffffffffffffffffffffffffff16611e646117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb1906141fa565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600f60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd45750611fd3826127c1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120c2836113d4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061211382611fdb565b612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499061413a565b60405180910390fd5b600061215d836113d4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121cc57508373ffffffffffffffffffffffffffffffffffffffff166121b4846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b806121dd57506121dc8185611cb2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612206826113d4565b73ffffffffffffffffffffffffffffffffffffffff161461225c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122539061421a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c3906140fa565b60405180910390fd5b6122d783838361282b565b6122e260008261204f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123329190614589565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612389919061446e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61245c82826040518060200160405280600081525061293f565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125318484846121e6565b61253d8484848461299a565b61257c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125739061407a565b60405180910390fd5b50505050565b60606006805461259190614683565b80601f01602080910402602001604051908101604052809291908181526020018280546125bd90614683565b801561260a5780601f106125df5761010080835404028352916020019161260a565b820191906000526020600020905b8154815290600101906020018083116125ed57829003601f168201915b5050505050905090565b6060600082141561265c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127bc565b600082905060005b6000821461268e578080612677906146b5565b915050600a8261268791906144fe565b9150612664565b60008167ffffffffffffffff8111156126d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127025781602001600182028036833780820191505090505b5090505b600085146127b55760018261271b9190614589565b9150600a8561272a91906146fe565b6030612736919061446e565b60f81b818381518110612772577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127ae91906144fe565b9450612706565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612836838383612b31565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128795761287481612b36565b6128b8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128b7576128b68382612b7f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128fb576128f681612cec565b61293a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612939576129388282612e2f565b5b5b505050565b6129498383612eae565b612956600084848461299a565b612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c9061407a565b60405180910390fd5b505050565b60006129bb8473ffffffffffffffffffffffffffffffffffffffff1661307c565b15612b24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e4612047565b8786866040518563ffffffff1660e01b8152600401612a069493929190613f6f565b602060405180830381600087803b158015612a2057600080fd5b505af1925050508015612a5157506040513d601f19601f82011682018060405250810190612a4e9190613527565b60015b612ad4573d8060008114612a81576040519150601f19603f3d011682016040523d82523d6000602084013e612a86565b606091505b50600081511415612acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac39061407a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b29565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8c84611486565b612b969190614589565b9050600060086000848152602001908152602001600020549050818114612c7b576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612d009190614589565b90506000600a6000848152602001908152602001600020549050600060098381548110612d56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612d9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e3a83611486565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f15906141ba565b60405180910390fd5b612f2781611fdb565b15612f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5e906140ba565b60405180910390fd5b612f736000838361282b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fc3919061446e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461309b90614683565b90600052602060002090601f0160209004810192826130bd5760008555613104565b82601f106130d657805160ff1916838001178555613104565b82800160010185558215613104579182015b828111156131035782518255916020019190600101906130e8565b5b5090506131119190613115565b5090565b5b8082111561312e576000816000905550600101613116565b5090565b600061314561314084614366565b614335565b9050808382526020820190508285602086028201111561316457600080fd5b60005b85811015613194578161317a8882613301565b845260208401935060208301925050600181019050613167565b5050509392505050565b60006131b16131ac84614392565b614335565b9050828152602081018484840111156131c957600080fd5b6131d4848285614641565b509392505050565b60006131ef6131ea846143c2565b614335565b90508281526020810184848401111561320757600080fd5b613212848285614641565b509392505050565b600081359050613229816147fc565b92915050565b600082601f83011261324057600080fd5b8151613250848260208601613132565b91505092915050565b60008135905061326881614813565b92915050565b60008135905061327d8161482a565b92915050565b6000815190506132928161482a565b92915050565b600082601f8301126132a957600080fd5b81356132b984826020860161319e565b91505092915050565b600082601f8301126132d357600080fd5b81356132e38482602086016131dc565b91505092915050565b6000813590506132fb81614841565b92915050565b60008151905061331081614841565b92915050565b60006020828403121561332857600080fd5b60006133368482850161321a565b91505092915050565b6000806040838503121561335257600080fd5b60006133608582860161321a565b92505060206133718582860161321a565b9150509250929050565b60008060006060848603121561339057600080fd5b600061339e8682870161321a565b93505060206133af8682870161321a565b92505060406133c0868287016132ec565b9150509250925092565b600080600080608085870312156133e057600080fd5b60006133ee8782880161321a565b94505060206133ff8782880161321a565b9350506040613410878288016132ec565b925050606085013567ffffffffffffffff81111561342d57600080fd5b61343987828801613298565b91505092959194509250565b6000806040838503121561345857600080fd5b60006134668582860161321a565b925050602061347785828601613259565b9150509250929050565b6000806040838503121561349457600080fd5b60006134a28582860161321a565b92505060206134b3858286016132ec565b9150509250929050565b6000602082840312156134cf57600080fd5b600082015167ffffffffffffffff8111156134e957600080fd5b6134f58482850161322f565b91505092915050565b60006020828403121561351057600080fd5b600061351e8482850161326e565b91505092915050565b60006020828403121561353957600080fd5b600061354784828501613283565b91505092915050565b60006020828403121561356257600080fd5b600082013567ffffffffffffffff81111561357c57600080fd5b613588848285016132c2565b91505092915050565b6000602082840312156135a357600080fd5b60006135b1848285016132ec565b91505092915050565b60006135c68383613f05565b60208301905092915050565b6135db816145bd565b82525050565b60006135ec82614402565b6135f68185614430565b9350613601836143f2565b8060005b8381101561363257815161361988826135ba565b975061362483614423565b925050600181019050613605565b5085935050505092915050565b613648816145cf565b82525050565b60006136598261440d565b6136638185614441565b9350613673818560208601614650565b61367c816147eb565b840191505092915050565b600061369282614418565b61369c8185614452565b93506136ac818560208601614650565b6136b5816147eb565b840191505092915050565b60006136cb82614418565b6136d58185614463565b93506136e5818560208601614650565b80840191505092915050565b60006136fe601d83614452565b91507f4d696e7420776f7572642065786365656420746f74616c537570706c790000006000830152602082019050919050565b600061373e601383614452565b91507f457863656564206d6178207175616e74697479000000000000000000000000006000830152602082019050919050565b600061377e602b83614452565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137e4603283614452565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061384a602683614452565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138b0601c83614452565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138f0600d83614452565b91507f4e4f2044415320544f4b454e53000000000000000000000000000000000000006000830152602082019050919050565b6000613930602483614452565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613996601983614452565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139d6602c83614452565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a3c603883614452565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613aa2602a83614452565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b08602983614452565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6e602083614452565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613bae602c83614452565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c14602083614452565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c54602983614452565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cba602f83614452565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d20601183614452565b91507f57726f6e6720616d6f756e742073656e740000000000000000000000000000006000830152602082019050919050565b6000613d60602183614452565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dc6603183614452565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e2c602c83614452565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613e92601883614452565b91507f4d696e7420746f20746865207a65726f206164647265737300000000000000006000830152602082019050919050565b6000613ed2602083614452565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613f0e81614627565b82525050565b613f1d81614627565b82525050565b6000613f2f82866136c0565b9150613f3b82856136c0565b9150613f4782846136c0565b9150819050949350505050565b6000602082019050613f6960008301846135d2565b92915050565b6000608082019050613f8460008301876135d2565b613f9160208301866135d2565b613f9e6040830185613f14565b8181036060830152613fb0818461364e565b905095945050505050565b60006020820190508181036000830152613fd581846135e1565b905092915050565b6000602082019050613ff2600083018461363f565b92915050565b600060208201905081810360008301526140128184613687565b905092915050565b60006020820190508181036000830152614033816136f1565b9050919050565b6000602082019050818103600083015261405381613731565b9050919050565b6000602082019050818103600083015261407381613771565b9050919050565b60006020820190508181036000830152614093816137d7565b9050919050565b600060208201905081810360008301526140b38161383d565b9050919050565b600060208201905081810360008301526140d3816138a3565b9050919050565b600060208201905081810360008301526140f3816138e3565b9050919050565b6000602082019050818103600083015261411381613923565b9050919050565b6000602082019050818103600083015261413381613989565b9050919050565b60006020820190508181036000830152614153816139c9565b9050919050565b6000602082019050818103600083015261417381613a2f565b9050919050565b6000602082019050818103600083015261419381613a95565b9050919050565b600060208201905081810360008301526141b381613afb565b9050919050565b600060208201905081810360008301526141d381613b61565b9050919050565b600060208201905081810360008301526141f381613ba1565b9050919050565b6000602082019050818103600083015261421381613c07565b9050919050565b6000602082019050818103600083015261423381613c47565b9050919050565b6000602082019050818103600083015261425381613cad565b9050919050565b6000602082019050818103600083015261427381613d13565b9050919050565b6000602082019050818103600083015261429381613d53565b9050919050565b600060208201905081810360008301526142b381613db9565b9050919050565b600060208201905081810360008301526142d381613e1f565b9050919050565b600060208201905081810360008301526142f381613e85565b9050919050565b6000602082019050818103600083015261431381613ec5565b9050919050565b600060208201905061432f6000830184613f14565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561435c5761435b6147bc565b5b8060405250919050565b600067ffffffffffffffff821115614381576143806147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143ad576143ac6147bc565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156143dd576143dc6147bc565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061447982614627565b915061448483614627565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144b9576144b861472f565b5b828201905092915050565b60006144cf82614631565b91506144da83614631565b92508263ffffffff038211156144f3576144f261472f565b5b828201905092915050565b600061450982614627565b915061451483614627565b9250826145245761452361475e565b5b828204905092915050565b600061453a82614627565b915061454583614627565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561457e5761457d61472f565b5b828202905092915050565b600061459482614627565b915061459f83614627565b9250828210156145b2576145b161472f565b5b828203905092915050565b60006145c882614607565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561466e578082015181840152602081019050614653565b8381111561467d576000848401525b50505050565b6000600282049050600182168061469b57607f821691505b602082108114156146af576146ae61478d565b5b50919050565b60006146c082614627565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146f3576146f261472f565b5b600182019050919050565b600061470982614627565b915061471483614627565b9250826147245761472361475e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614805816145bd565b811461481057600080fd5b50565b61481c816145cf565b811461482757600080fd5b50565b614833816145db565b811461483e57600080fd5b50565b61484a81614627565b811461485557600080fd5b5056fea26469706673582212206c916442bc257a2a4d668fab3df3aeff44eaab58490e33df3f6b05e8adf9371d64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e77587956684d54424639597266367733394a7a4b616e586255535a386d6465725a386f6b795447476d627a2f000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063a260531b116100a0578063db4568e21161006f578063db4568e2146106ee578063e985e9c514610719578063f2fde38b14610756578063fa62884c1461077f578063fdea8e0b14610796576101ee565b8063a260531b14610620578063b187bd261461065d578063b88d4fde14610688578063c87b56dd146106b1576101ee565b806391b7f5ed116100dc57806391b7f5ed1461057857806395d89b41146105a1578063a035b1fe146105cc578063a22cb465146105f7576101ee565b8063715018a6146104ce578063743976a0146104e55780638462151c146105105780638da5cb5b1461054d576101ee565b80633542aee2116101855780634f6ccce7116101545780634f6ccce7146103ee57806355f804b31461042b5780636352211e1461045457806370a0823114610491576101ee565b80633542aee2146103695780633ccfd60b1461039257806340c10f19146103a957806342842e0e146103c5576101ee565b80631725051f116101c15780631725051f146102c157806318160ddd146102d857806323b872dd146103035780632f745c591461032c576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906134fe565b6107c1565b6040516102279190613fdd565b60405180910390f35b34801561023c57600080fd5b5061024561083b565b6040516102529190613ff8565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613591565b6108cd565b60405161028f9190613f54565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613481565b610952565b005b3480156102cd57600080fd5b506102d6610a6a565b005b3480156102e457600080fd5b506102ed610b12565b6040516102fa919061431a565b60405180910390f35b34801561030f57600080fd5b5061032a6004803603810190610325919061337b565b610b1f565b005b34801561033857600080fd5b50610353600480360381019061034e9190613481565b610b7f565b604051610360919061431a565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190613481565b610c24565b005b34801561039e57600080fd5b506103a7610d58565b005b6103c360048036038101906103be9190613481565b610e23565b005b3480156103d157600080fd5b506103ec60048036038101906103e7919061337b565b611287565b005b3480156103fa57600080fd5b5061041560048036038101906104109190613591565b6112a7565b604051610422919061431a565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613550565b61133e565b005b34801561046057600080fd5b5061047b60048036038101906104769190613591565b6113d4565b6040516104889190613f54565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613316565b611486565b6040516104c5919061431a565b60405180910390f35b3480156104da57600080fd5b506104e361153e565b005b3480156104f157600080fd5b506104fa611643565b6040516105079190613ff8565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613316565b6116d1565b6040516105449190613fbb565b60405180910390f35b34801561055957600080fd5b506105626117cb565b60405161056f9190613f54565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613591565b6117f5565b005b3480156105ad57600080fd5b506105b661187b565b6040516105c39190613ff8565b60405180910390f35b3480156105d857600080fd5b506105e161190d565b6040516105ee919061431a565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190613445565b611913565b005b34801561062c57600080fd5b5061064760048036038101906106429190613316565b611a94565b604051610654919061431a565b60405180910390f35b34801561066957600080fd5b50610672611b53565b60405161067f9190613fdd565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa91906133ca565b611b66565b005b3480156106bd57600080fd5b506106d860048036038101906106d39190613591565b611bc8565b6040516106e59190613ff8565b60405180910390f35b3480156106fa57600080fd5b50610703611cac565b604051610710919061431a565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b919061333f565b611cb2565b60405161074d9190613fdd565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190613316565b611d46565b005b34801561078b57600080fd5b50610794611e3e565b005b3480156107a257600080fd5b506107ab611ee6565b6040516107b89190613fdd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610834575061083382611ef9565b5b9050919050565b60606000805461084a90614683565b80601f016020809104026020016040519081016040528092919081815260200182805461087690614683565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611fdb565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906141da565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d826113d4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c59061427a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed612047565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16612047565b611cb2565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529061415a565b60405180910390fd5b610a65838361204f565b505050565b610a72612047565b73ffffffffffffffffffffffffffffffffffffffff16610a906117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add906141fa565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b6000600980549050905090565b610b30610b2a612047565b82612108565b610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061429a565b60405180910390fd5b610b7a8383836121e6565b505050565b6000610b8a83611486565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061405a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c2c612047565b73ffffffffffffffffffffffffffffffffffffffff16610c4a6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c97906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906142da565b60405180910390fd5b6000610d1a610b12565b905060005b82811015610d5257610d318483612442565b8180610d3c906146b5565b9250508080610d4a906146b5565b915050610d1f565b50505050565b610d60612047565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb906141fa565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e1f573d6000803e3d6000fd5b5050565b611388610e2e610b12565b10610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e659061401a565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb906142fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b906142da565b60405180910390fd5b6000600590506000600e54905060011515600f60019054906101000a900460ff1615151415611113576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b8152600401610fba9190613f54565b60006040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061100f91906134bd565b9050601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1681516110739190614589565b9250601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1681511161110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906140da565b60405180910390fd5b60009150505b81831115611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d9061403a565b60405180910390fd5b6000611160610b12565b905034848361116f919061452f565b11156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a79061425a565b60405180910390fd5b60005b848110156111e65781806111c6906146b5565b9250506111d38683612442565b80806111de906146b5565b9150506111b3565b5060011515600f60019054906101000a900460ff16151514156112805783601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900463ffffffff1661126191906144c4565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b5050505050565b6112a283838360405180602001604052806000815250611b66565b505050565b60006112b1610b12565b82106112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e9906142ba565b60405180910390fd5b6009828154811061132c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611346612047565b73ffffffffffffffffffffffffffffffffffffffff166113646117cb565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906141fa565b60405180910390fd5b80600690805190602001906113d092919061308f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561147d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114749061419a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061417a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611546612047565b73ffffffffffffffffffffffffffffffffffffffff166115646117cb565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b1906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36116416000612460565b565b6006805461165090614683565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614683565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b505050505081565b606060006116de83611486565b905060008167ffffffffffffffff811115611722577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117505781602001602082028036833780820191505090505b50905060005b828110156117c0576117688582610b7f565b8282815181106117a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806117b8906146b5565b915050611756565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117fd612047565b73ffffffffffffffffffffffffffffffffffffffff1661181b6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906141fa565b60405180910390fd5b80600e8190555050565b60606001805461188a90614683565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614683565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b600e5481565b61191b612047565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119809061411a565b60405180910390fd5b8060056000611996612047565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a43612047565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190613fdd565b60405180910390a35050565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c846040518263ffffffff1660e01b8152600401611af29190613f54565b60006040518083038186803b158015611b0a57600080fd5b505afa158015611b1e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b4791906134bd565b90508051915050919050565b600f60009054906101000a900460ff1681565b611b77611b71612047565b83612108565b611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061429a565b60405180910390fd5b611bc284848484612526565b50505050565b6060611bd382611fdb565b611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061423a565b60405180910390fd5b6000611c1c612582565b905060006040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525090506000825111611c765760405180602001604052806000815250611ca3565b81611c8085612614565b82604051602001611c9393929190613f23565b6040516020818303038152906040525b92505050919050565b61138881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4e612047565b73ffffffffffffffffffffffffffffffffffffffff16611d6c6117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db9906141fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e299061409a565b60405180910390fd5b611e3b81612460565b50565b611e46612047565b73ffffffffffffffffffffffffffffffffffffffff16611e646117cb565b73ffffffffffffffffffffffffffffffffffffffff1614611eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb1906141fa565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600f60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd45750611fd3826127c1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120c2836113d4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061211382611fdb565b612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499061413a565b60405180910390fd5b600061215d836113d4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121cc57508373ffffffffffffffffffffffffffffffffffffffff166121b4846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b806121dd57506121dc8185611cb2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612206826113d4565b73ffffffffffffffffffffffffffffffffffffffff161461225c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122539061421a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c3906140fa565b60405180910390fd5b6122d783838361282b565b6122e260008261204f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123329190614589565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612389919061446e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61245c82826040518060200160405280600081525061293f565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125318484846121e6565b61253d8484848461299a565b61257c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125739061407a565b60405180910390fd5b50505050565b60606006805461259190614683565b80601f01602080910402602001604051908101604052809291908181526020018280546125bd90614683565b801561260a5780601f106125df5761010080835404028352916020019161260a565b820191906000526020600020905b8154815290600101906020018083116125ed57829003601f168201915b5050505050905090565b6060600082141561265c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127bc565b600082905060005b6000821461268e578080612677906146b5565b915050600a8261268791906144fe565b9150612664565b60008167ffffffffffffffff8111156126d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127025781602001600182028036833780820191505090505b5090505b600085146127b55760018261271b9190614589565b9150600a8561272a91906146fe565b6030612736919061446e565b60f81b818381518110612772577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127ae91906144fe565b9450612706565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612836838383612b31565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128795761287481612b36565b6128b8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128b7576128b68382612b7f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128fb576128f681612cec565b61293a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612939576129388282612e2f565b5b5b505050565b6129498383612eae565b612956600084848461299a565b612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c9061407a565b60405180910390fd5b505050565b60006129bb8473ffffffffffffffffffffffffffffffffffffffff1661307c565b15612b24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e4612047565b8786866040518563ffffffff1660e01b8152600401612a069493929190613f6f565b602060405180830381600087803b158015612a2057600080fd5b505af1925050508015612a5157506040513d601f19601f82011682018060405250810190612a4e9190613527565b60015b612ad4573d8060008114612a81576040519150601f19603f3d011682016040523d82523d6000602084013e612a86565b606091505b50600081511415612acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac39061407a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b29565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8c84611486565b612b969190614589565b9050600060086000848152602001908152602001600020549050818114612c7b576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612d009190614589565b90506000600a6000848152602001908152602001600020549050600060098381548110612d56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612d9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e3a83611486565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f15906141ba565b60405180910390fd5b612f2781611fdb565b15612f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5e906140ba565b60405180910390fd5b612f736000838361282b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fc3919061446e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461309b90614683565b90600052602060002090601f0160209004810192826130bd5760008555613104565b82601f106130d657805160ff1916838001178555613104565b82800160010185558215613104579182015b828111156131035782518255916020019190600101906130e8565b5b5090506131119190613115565b5090565b5b8082111561312e576000816000905550600101613116565b5090565b600061314561314084614366565b614335565b9050808382526020820190508285602086028201111561316457600080fd5b60005b85811015613194578161317a8882613301565b845260208401935060208301925050600181019050613167565b5050509392505050565b60006131b16131ac84614392565b614335565b9050828152602081018484840111156131c957600080fd5b6131d4848285614641565b509392505050565b60006131ef6131ea846143c2565b614335565b90508281526020810184848401111561320757600080fd5b613212848285614641565b509392505050565b600081359050613229816147fc565b92915050565b600082601f83011261324057600080fd5b8151613250848260208601613132565b91505092915050565b60008135905061326881614813565b92915050565b60008135905061327d8161482a565b92915050565b6000815190506132928161482a565b92915050565b600082601f8301126132a957600080fd5b81356132b984826020860161319e565b91505092915050565b600082601f8301126132d357600080fd5b81356132e38482602086016131dc565b91505092915050565b6000813590506132fb81614841565b92915050565b60008151905061331081614841565b92915050565b60006020828403121561332857600080fd5b60006133368482850161321a565b91505092915050565b6000806040838503121561335257600080fd5b60006133608582860161321a565b92505060206133718582860161321a565b9150509250929050565b60008060006060848603121561339057600080fd5b600061339e8682870161321a565b93505060206133af8682870161321a565b92505060406133c0868287016132ec565b9150509250925092565b600080600080608085870312156133e057600080fd5b60006133ee8782880161321a565b94505060206133ff8782880161321a565b9350506040613410878288016132ec565b925050606085013567ffffffffffffffff81111561342d57600080fd5b61343987828801613298565b91505092959194509250565b6000806040838503121561345857600080fd5b60006134668582860161321a565b925050602061347785828601613259565b9150509250929050565b6000806040838503121561349457600080fd5b60006134a28582860161321a565b92505060206134b3858286016132ec565b9150509250929050565b6000602082840312156134cf57600080fd5b600082015167ffffffffffffffff8111156134e957600080fd5b6134f58482850161322f565b91505092915050565b60006020828403121561351057600080fd5b600061351e8482850161326e565b91505092915050565b60006020828403121561353957600080fd5b600061354784828501613283565b91505092915050565b60006020828403121561356257600080fd5b600082013567ffffffffffffffff81111561357c57600080fd5b613588848285016132c2565b91505092915050565b6000602082840312156135a357600080fd5b60006135b1848285016132ec565b91505092915050565b60006135c68383613f05565b60208301905092915050565b6135db816145bd565b82525050565b60006135ec82614402565b6135f68185614430565b9350613601836143f2565b8060005b8381101561363257815161361988826135ba565b975061362483614423565b925050600181019050613605565b5085935050505092915050565b613648816145cf565b82525050565b60006136598261440d565b6136638185614441565b9350613673818560208601614650565b61367c816147eb565b840191505092915050565b600061369282614418565b61369c8185614452565b93506136ac818560208601614650565b6136b5816147eb565b840191505092915050565b60006136cb82614418565b6136d58185614463565b93506136e5818560208601614650565b80840191505092915050565b60006136fe601d83614452565b91507f4d696e7420776f7572642065786365656420746f74616c537570706c790000006000830152602082019050919050565b600061373e601383614452565b91507f457863656564206d6178207175616e74697479000000000000000000000000006000830152602082019050919050565b600061377e602b83614452565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137e4603283614452565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061384a602683614452565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138b0601c83614452565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138f0600d83614452565b91507f4e4f2044415320544f4b454e53000000000000000000000000000000000000006000830152602082019050919050565b6000613930602483614452565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613996601983614452565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139d6602c83614452565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a3c603883614452565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613aa2602a83614452565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b08602983614452565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6e602083614452565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613bae602c83614452565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c14602083614452565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c54602983614452565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cba602f83614452565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d20601183614452565b91507f57726f6e6720616d6f756e742073656e740000000000000000000000000000006000830152602082019050919050565b6000613d60602183614452565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dc6603183614452565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e2c602c83614452565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613e92601883614452565b91507f4d696e7420746f20746865207a65726f206164647265737300000000000000006000830152602082019050919050565b6000613ed2602083614452565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613f0e81614627565b82525050565b613f1d81614627565b82525050565b6000613f2f82866136c0565b9150613f3b82856136c0565b9150613f4782846136c0565b9150819050949350505050565b6000602082019050613f6960008301846135d2565b92915050565b6000608082019050613f8460008301876135d2565b613f9160208301866135d2565b613f9e6040830185613f14565b8181036060830152613fb0818461364e565b905095945050505050565b60006020820190508181036000830152613fd581846135e1565b905092915050565b6000602082019050613ff2600083018461363f565b92915050565b600060208201905081810360008301526140128184613687565b905092915050565b60006020820190508181036000830152614033816136f1565b9050919050565b6000602082019050818103600083015261405381613731565b9050919050565b6000602082019050818103600083015261407381613771565b9050919050565b60006020820190508181036000830152614093816137d7565b9050919050565b600060208201905081810360008301526140b38161383d565b9050919050565b600060208201905081810360008301526140d3816138a3565b9050919050565b600060208201905081810360008301526140f3816138e3565b9050919050565b6000602082019050818103600083015261411381613923565b9050919050565b6000602082019050818103600083015261413381613989565b9050919050565b60006020820190508181036000830152614153816139c9565b9050919050565b6000602082019050818103600083015261417381613a2f565b9050919050565b6000602082019050818103600083015261419381613a95565b9050919050565b600060208201905081810360008301526141b381613afb565b9050919050565b600060208201905081810360008301526141d381613b61565b9050919050565b600060208201905081810360008301526141f381613ba1565b9050919050565b6000602082019050818103600083015261421381613c07565b9050919050565b6000602082019050818103600083015261423381613c47565b9050919050565b6000602082019050818103600083015261425381613cad565b9050919050565b6000602082019050818103600083015261427381613d13565b9050919050565b6000602082019050818103600083015261429381613d53565b9050919050565b600060208201905081810360008301526142b381613db9565b9050919050565b600060208201905081810360008301526142d381613e1f565b9050919050565b600060208201905081810360008301526142f381613e85565b9050919050565b6000602082019050818103600083015261431381613ec5565b9050919050565b600060208201905061432f6000830184613f14565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561435c5761435b6147bc565b5b8060405250919050565b600067ffffffffffffffff821115614381576143806147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143ad576143ac6147bc565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156143dd576143dc6147bc565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061447982614627565b915061448483614627565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144b9576144b861472f565b5b828201905092915050565b60006144cf82614631565b91506144da83614631565b92508263ffffffff038211156144f3576144f261472f565b5b828201905092915050565b600061450982614627565b915061451483614627565b9250826145245761452361475e565b5b828204905092915050565b600061453a82614627565b915061454583614627565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561457e5761457d61472f565b5b828202905092915050565b600061459482614627565b915061459f83614627565b9250828210156145b2576145b161472f565b5b828203905092915050565b60006145c882614607565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561466e578082015181840152602081019050614653565b8381111561467d576000848401525b50505050565b6000600282049050600182168061469b57607f821691505b602082108114156146af576146ae61478d565b5b50919050565b60006146c082614627565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146f3576146f261472f565b5b600182019050919050565b600061470982614627565b915061471483614627565b9250826147245761472361475e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614805816145bd565b811461481057600080fd5b50565b61481c816145cf565b811461482757600080fd5b50565b614833816145db565b811461483e57600080fd5b50565b61484a81614627565b811461485557600080fd5b5056fea26469706673582212206c916442bc257a2a4d668fab3df3aeff44eaab58490e33df3f6b05e8adf9371d64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e77587956684d54424639597266367733394a7a4b616e586255535a386d6465725a386f6b795447476d627a2f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmNwXyVhMTBF9Yrf6w39JzKanXbUSZ8mderZ8okyTGGmbz/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d4e77587956684d54424639597266367733394a7a4b616e586255535a
Arg [4] : 386d6465725a386f6b795447476d627a2f000000000000000000000000000000
Deployed Bytecode Sourcemap
49141:3148:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42882:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30828:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32445:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31968:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51152:83;;;;;;;;;;;;;:::i;:::-;;43522:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33335:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43190:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51343:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52146:140;;;;;;;;;;;;;:::i;:::-;;49752:1016;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33745:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43712:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50956:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30522:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30252:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27940:150;;;;;;;;;;;;;:::i;:::-;;29550:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51787:351;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27289:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51243:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30997:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49455:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32738:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50776:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49515:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34001:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31172:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49408:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28245:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51061:83;;;;;;;;;;;;;:::i;:::-;;49549:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42882:224;42984:4;43023:35;43008:50;;;:11;:50;;;;:90;;;;43062:36;43086:11;43062:23;:36::i;:::-;43008:90;43001:97;;42882:224;;;:::o;30828:100::-;30882:13;30915:5;30908:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30828:100;:::o;32445:221::-;32521:7;32549:16;32557:7;32549;:16::i;:::-;32541:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32634:15;:24;32650:7;32634:24;;;;;;;;;;;;;;;;;;;;;32627:31;;32445:221;;;:::o;31968:411::-;32049:13;32065:23;32080:7;32065:14;:23::i;:::-;32049:39;;32113:5;32107:11;;:2;:11;;;;32099:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32207:5;32191:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32216:37;32233:5;32240:12;:10;:12::i;:::-;32216:16;:37::i;:::-;32191:62;32169:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32350:21;32359:2;32363:7;32350:8;:21::i;:::-;31968:411;;;:::o;51152:83::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51220:7:::1;;;;;;;;;;;51219:8;51209:7;;:18;;;;;;;;;;;;;;;;;;51152:83::o:0;43522:113::-;43583:7;43610:10;:17;;;;43603:24;;43522:113;:::o;33335:339::-;33530:41;33549:12;:10;:12::i;:::-;33563:7;33530:18;:41::i;:::-;33522:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33638:28;33648:4;33654:2;33658:7;33638:9;:28::i;:::-;33335:339;;;:::o;43190:256::-;43287:7;43323:23;43340:5;43323:16;:23::i;:::-;43315:5;:31;43307:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43412:12;:19;43425:5;43412:19;;;;;;;;;;;;;;;:26;43432:5;43412:26;;;;;;;;;;;;43405:33;;43190:256;;;;:::o;51343:308::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51445:1:::1;51430:17;;:3;:17;;;;51422:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;51489:15;51507:13;:11;:13::i;:::-;51489:31;;51536:9;51531:113;51555:8;51551:1;:12;51531:113;;;51585:23;51595:3;51600:7;51585:9;:23::i;:::-;51623:9;;;;;:::i;:::-;;;;51565:3;;;;;:::i;:::-;;;;51531:113;;;;27580:1;51343:308:::0;;:::o;52146:140::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52194:12:::1;52209:21;52194:36;;52249:10;52241:28;;:37;52270:7;52241:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27580:1;52146:140::o:0;49752:1016::-;49444:4;51697:13;:11;:13::i;:::-;:28;51689:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49854:5:::1;49842:17;;:8;;;;;;;;;;;:17;;;49834:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49930:1;49915:17;;:3;:17;;;;49907:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49974:19;49996:1;49974:23;;50008:18;50029:5;;50008:26;;50060:4;50049:15;;:7;;;;;;;;;;;:15;;;50045:289;;;50081:23;50107:3;;;;;;;;;;;:17;;;50125:10;50107:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50081:55;;50181:15;:27;50197:10;50181:27;;;;;;;;;;;;;;;;;;;;;;;;;50165:43;;:6;:13;:43;;;;:::i;:::-;50151:57;;50248:15;:27;50264:10;50248:27;;;;;;;;;;;;;;;;;;;;;;;;;50232:43;;:6;:13;:43;50223:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50321:1;50308:14;;50045:289;;50366:11;50354:8;:23;;50346:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50414:15;50432:13;:11;:13::i;:::-;50414:31;;50499:9;50487:8;50474:10;:21;;;;:::i;:::-;:34;;50466:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50546:9;50541:113;50565:8;50561:1;:12;50541:113;;;50595:9;;;;;:::i;:::-;;;;50619:23;50629:3;50634:7;50619:9;:23::i;:::-;50575:3;;;;;:::i;:::-;;;;50541:113;;;;50681:4;50670:15;;:7;;;;;;;;;;;:15;;;50666:95;;;50740:8;50702:15;:27;50718:10;50702:27;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50666:95;51770:1;;;49752:1016:::0;;:::o;33745:185::-;33883:39;33900:4;33906:2;33910:7;33883:39;;;;;;;;;;;;:16;:39::i;:::-;33745:185;;;:::o;43712:233::-;43787:7;43823:30;:28;:30::i;:::-;43815:5;:38;43807:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43920:10;43931:5;43920:17;;;;;;;;;;;;;;;;;;;;;;;;43913:24;;43712:233;;;:::o;50956:97::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51038:7:::1;51027:8;:18;;;;;;;;;;;;:::i;:::-;;50956:97:::0;:::o;30522:239::-;30594:7;30614:13;30630:7;:16;30638:7;30630:16;;;;;;;;;;;;;;;;;;;;;30614:32;;30682:1;30665:19;;:5;:19;;;;30657:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30748:5;30741:12;;;30522:239;;;:::o;30252:208::-;30324:7;30369:1;30352:19;;:5;:19;;;;30344:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30436:9;:16;30446:5;30436:16;;;;;;;;;;;;;;;;30429:23;;30252:208;;;:::o;27940:150::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28047:1:::1;28010:40;;28031:6;;;;;;;;;;;28010:40;;;;;;;;;;;;28061:21;28079:1;28061:9;:21::i;:::-;27940:150::o:0;29550:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51787:351::-;51847:16;51881:13;51897:17;51907:6;51897:9;:17::i;:::-;51881:33;;51925:23;51965:5;51951:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51925:46;;51987:13;51982:125;52014:5;52006;:13;51982:125;;;52061:34;52081:6;52089:5;52061:19;:34::i;:::-;52045:6;52052:5;52045:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;52021:7;;;;;:::i;:::-;;;;51982:125;;;;52124:6;52117:13;;;;51787:351;;;:::o;27289:87::-;27335:7;27362:6;;;;;;;;;;;27355:13;;27289:87;:::o;51243:92::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51318:9:::1;51310:5;:17;;;;51243:92:::0;:::o;30997:104::-;31053:13;31086:7;31079:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30997:104;:::o;49455:40::-;;;;:::o;32738:295::-;32853:12;:10;:12::i;:::-;32841:24;;:8;:24;;;;32833:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32953:8;32908:18;:32;32927:12;:10;:12::i;:::-;32908:32;;;;;;;;;;;;;;;:42;32941:8;32908:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33006:8;32977:48;;32992:12;:10;:12::i;:::-;32977:48;;;33016:8;32977:48;;;;;;:::i;:::-;;;;;;;;32738:295;;:::o;50776:172::-;50838:7;50858:23;50884:3;;;;;;;;;;;:17;;;50902:6;50884:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50858:51;;50927:6;:13;50920:20;;;50776:172;;;:::o;49515:27::-;;;;;;;;;;;;;:::o;34001:328::-;34176:41;34195:12;:10;:12::i;:::-;34209:7;34176:18;:41::i;:::-;34168:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34282:39;34296:4;34302:2;34306:7;34315:5;34282:13;:39::i;:::-;34001:328;;;;:::o;31172:387::-;31245:13;31279:16;31287:7;31279;:16::i;:::-;31271:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31360:18;31381:9;:7;:9::i;:::-;31360:30;;31401:27;:37;;;;;;;;;;;;;;;;;;;31477:1;31462:4;31456:18;:22;:95;;;;;;;;;;;;;;;;;31505:4;31511:18;:7;:16;:18::i;:::-;31531:13;31488:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31456:95;31449:102;;;;31172:387;;;:::o;49408:40::-;49444:4;49408:40;:::o;33104:164::-;33201:4;33225:18;:25;33244:5;33225:25;;;;;;;;;;;;;;;:35;33251:8;33225:35;;;;;;;;;;;;;;;;;;;;;;;;;33218:42;;33104:164;;;;:::o;28245:192::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28354:1:::1;28334:22;;:8;:22;;;;28326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28410:19;28420:8;28410:9;:19::i;:::-;28245:192:::0;:::o;51061:83::-;27520:12;:10;:12::i;:::-;27509:23;;:7;:5;:7::i;:::-;:23;;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51128:8:::1;;;;;;;;;;;51127:9;51116:8;;:20;;;;;;;;;;;;;;;;;;51061:83::o:0;49549:26::-;;;;;;;;;;;;;:::o;29883:305::-;29985:4;30037:25;30022:40;;;:11;:40;;;;:105;;;;30094:33;30079:48;;;:11;:48;;;;30022:105;:158;;;;30144:36;30168:11;30144:23;:36::i;:::-;30022:158;30002:178;;29883:305;;;:::o;35839:127::-;35904:4;35956:1;35928:30;;:7;:16;35936:7;35928:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35921:37;;35839:127;;;:::o;26067:98::-;26120:7;26147:10;26140:17;;26067:98;:::o;39821:174::-;39923:2;39896:15;:24;39912:7;39896:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39979:7;39975:2;39941:46;;39950:23;39965:7;39950:14;:23::i;:::-;39941:46;;;;;;;;;;;;39821:174;;:::o;36133:348::-;36226:4;36251:16;36259:7;36251;:16::i;:::-;36243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36327:13;36343:23;36358:7;36343:14;:23::i;:::-;36327:39;;36396:5;36385:16;;:7;:16;;;:51;;;;36429:7;36405:31;;:20;36417:7;36405:11;:20::i;:::-;:31;;;36385:51;:87;;;;36440:32;36457:5;36464:7;36440:16;:32::i;:::-;36385:87;36377:96;;;36133:348;;;;:::o;39125:578::-;39284:4;39257:31;;:23;39272:7;39257:14;:23::i;:::-;:31;;;39249:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39367:1;39353:16;;:2;:16;;;;39345:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39423:39;39444:4;39450:2;39454:7;39423:20;:39::i;:::-;39527:29;39544:1;39548:7;39527:8;:29::i;:::-;39588:1;39569:9;:15;39579:4;39569:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39617:1;39600:9;:13;39610:2;39600:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39648:2;39629:7;:16;39637:7;39629:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39687:7;39683:2;39668:27;;39677:4;39668:27;;;;;;;;;;;;39125:578;;;:::o;36823:110::-;36899:26;36909:2;36913:7;36899:26;;;;;;;;;;;;:9;:26::i;:::-;36823:110;;:::o;28445:173::-;28501:16;28520:6;;;;;;;;;;;28501:25;;28546:8;28537:6;;:17;;;;;;;;;;;;;;;;;;28601:8;28570:40;;28591:8;28570:40;;;;;;;;;;;;28445:173;;:::o;35211:315::-;35368:28;35378:4;35384:2;35388:7;35368:9;:28::i;:::-;35415:48;35438:4;35444:2;35448:7;35457:5;35415:22;:48::i;:::-;35407:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35211:315;;;;:::o;31807:99::-;31857:13;31890:8;31883:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31807:99;:::o;7296:723::-;7352:13;7582:1;7573:5;:10;7569:53;;;7600:10;;;;;;;;;;;;;;;;;;;;;7569:53;7632:12;7647:5;7632:20;;7663:14;7688:78;7703:1;7695:4;:9;7688:78;;7721:8;;;;;:::i;:::-;;;;7752:2;7744:10;;;;;:::i;:::-;;;7688:78;;;7776:19;7808:6;7798:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7776:39;;7826:154;7842:1;7833:5;:10;7826:154;;7870:1;7860:11;;;;;:::i;:::-;;;7937:2;7929:5;:10;;;;:::i;:::-;7916:2;:24;;;;:::i;:::-;7903:39;;7886:6;7893;7886:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7966:2;7957:11;;;;;:::i;:::-;;;7826:154;;;8004:6;7990:21;;;;;7296:723;;;;:::o;19161:157::-;19246:4;19285:25;19270:40;;;:11;:40;;;;19263:47;;19161:157;;;:::o;44558:589::-;44702:45;44729:4;44735:2;44739:7;44702:26;:45::i;:::-;44780:1;44764:18;;:4;:18;;;44760:187;;;44799:40;44831:7;44799:31;:40::i;:::-;44760:187;;;44869:2;44861:10;;:4;:10;;;44857:90;;44888:47;44921:4;44927:7;44888:32;:47::i;:::-;44857:90;44760:187;44975:1;44961:16;;:2;:16;;;44957:183;;;44994:45;45031:7;44994:36;:45::i;:::-;44957:183;;;45067:4;45061:10;;:2;:10;;;45057:83;;45088:40;45116:2;45120:7;45088:27;:40::i;:::-;45057:83;44957:183;44558:589;;;:::o;37160:321::-;37290:18;37296:2;37300:7;37290:5;:18::i;:::-;37341:54;37372:1;37376:2;37380:7;37389:5;37341:22;:54::i;:::-;37319:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37160:321;;;:::o;40560:803::-;40715:4;40736:15;:2;:13;;;:15::i;:::-;40732:624;;;40788:2;40772:36;;;40809:12;:10;:12::i;:::-;40823:4;40829:7;40838:5;40772:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40768:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41035:1;41018:6;:13;:18;41014:272;;;41061:60;;;;;;;;;;:::i;:::-;;;;;;;;41014:272;41236:6;41230:13;41221:6;41217:2;41213:15;41206:38;40768:533;40905:45;;;40895:55;;;:6;:55;;;;40888:62;;;;;40732:624;41340:4;41333:11;;40560:803;;;;;;;:::o;41935:126::-;;;;:::o;45870:164::-;45974:10;:17;;;;45947:15;:24;45963:7;45947:24;;;;;;;;;;;:44;;;;46002:10;46018:7;46002:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45870:164;:::o;46661:988::-;46927:22;46977:1;46952:22;46969:4;46952:16;:22::i;:::-;:26;;;;:::i;:::-;46927:51;;46989:18;47010:17;:26;47028:7;47010:26;;;;;;;;;;;;46989:47;;47157:14;47143:10;:28;47139:328;;47188:19;47210:12;:18;47223:4;47210:18;;;;;;;;;;;;;;;:34;47229:14;47210:34;;;;;;;;;;;;47188:56;;47294:11;47261:12;:18;47274:4;47261:18;;;;;;;;;;;;;;;:30;47280:10;47261:30;;;;;;;;;;;:44;;;;47411:10;47378:17;:30;47396:11;47378:30;;;;;;;;;;;:43;;;;47139:328;;47563:17;:26;47581:7;47563:26;;;;;;;;;;;47556:33;;;47607:12;:18;47620:4;47607:18;;;;;;;;;;;;;;;:34;47626:14;47607:34;;;;;;;;;;;47600:41;;;46661:988;;;;:::o;47944:1079::-;48197:22;48242:1;48222:10;:17;;;;:21;;;;:::i;:::-;48197:46;;48254:18;48275:15;:24;48291:7;48275:24;;;;;;;;;;;;48254:45;;48626:19;48648:10;48659:14;48648:26;;;;;;;;;;;;;;;;;;;;;;;;48626:48;;48712:11;48687:10;48698;48687:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48823:10;48792:15;:28;48808:11;48792:28;;;;;;;;;;;:41;;;;48964:15;:24;48980:7;48964:24;;;;;;;;;;;48957:31;;;48999:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47944:1079;;;;:::o;45448:221::-;45533:14;45550:20;45567:2;45550:16;:20::i;:::-;45533:37;;45608:7;45581:12;:16;45594:2;45581:16;;;;;;;;;;;;;;;:24;45598:6;45581:24;;;;;;;;;;;:34;;;;45655:6;45626:17;:26;45644:7;45626:26;;;;;;;;;;;:35;;;;45448:221;;;:::o;37817:382::-;37911:1;37897:16;;:2;:16;;;;37889:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37970:16;37978:7;37970;:16::i;:::-;37969:17;37961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38032:45;38061:1;38065:2;38069:7;38032:20;:45::i;:::-;38107:1;38090:9;:13;38100:2;38090:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38138:2;38119:7;:16;38127:7;38119:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38183:7;38179:2;38158:33;;38175:1;38158:33;;;;;;;;;;;;37817:382;;:::o;9736:387::-;9796:4;10004:12;10071:7;10059:20;10051:28;;10114:1;10107:4;:8;10100:15;;;9736:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:644:1:-;;156:80;171:64;228:6;171:64;:::i;:::-;156:80;:::i;:::-;147:89;;256:5;284:6;277:5;270:21;310:4;303:5;299:16;292:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;402:1;399;392:12;350:2;430:1;415:247;440:6;437:1;434:13;415:247;;;507:3;535:48;579:3;567:10;535:48;:::i;:::-;530:3;523:61;613:4;608:3;604:14;597:21;;647:4;642:3;638:14;631:21;;475:187;462:1;459;455:9;450:14;;415:247;;;419:14;137:531;;;;;;;:::o;674:342::-;;776:64;791:48;832:6;791:48;:::i;:::-;776:64;:::i;:::-;767:73;;863:6;856:5;849:21;901:4;894:5;890:16;939:3;930:6;925:3;921:16;918:25;915:2;;;956:1;953;946:12;915:2;969:41;1003:6;998:3;993;969:41;:::i;:::-;757:259;;;;;;:::o;1022:344::-;;1125:65;1140:49;1182:6;1140:49;:::i;:::-;1125:65;:::i;:::-;1116:74;;1213:6;1206:5;1199:21;1251:4;1244:5;1240:16;1289:3;1280:6;1275:3;1271:16;1268:25;1265:2;;;1306:1;1303;1296:12;1265:2;1319:41;1353:6;1348:3;1343;1319:41;:::i;:::-;1106:260;;;;;;:::o;1372:139::-;;1456:6;1443:20;1434:29;;1472:33;1499:5;1472:33;:::i;:::-;1424:87;;;;:::o;1534:318::-;;1665:3;1658:4;1650:6;1646:17;1642:27;1632:2;;1683:1;1680;1673:12;1632:2;1716:6;1710:13;1741:105;1842:3;1834:6;1827:4;1819:6;1815:17;1741:105;:::i;:::-;1732:114;;1622:230;;;;;:::o;1858:133::-;;1939:6;1926:20;1917:29;;1955:30;1979:5;1955:30;:::i;:::-;1907:84;;;;:::o;1997:137::-;;2080:6;2067:20;2058:29;;2096:32;2122:5;2096:32;:::i;:::-;2048:86;;;;:::o;2140:141::-;;2227:6;2221:13;2212:22;;2243:32;2269:5;2243:32;:::i;:::-;2202:79;;;;:::o;2300:271::-;;2404:3;2397:4;2389:6;2385:17;2381:27;2371:2;;2422:1;2419;2412:12;2371:2;2462:6;2449:20;2487:78;2561:3;2553:6;2546:4;2538:6;2534:17;2487:78;:::i;:::-;2478:87;;2361:210;;;;;:::o;2591:273::-;;2696:3;2689:4;2681:6;2677:17;2673:27;2663:2;;2714:1;2711;2704:12;2663:2;2754:6;2741:20;2779:79;2854:3;2846:6;2839:4;2831:6;2827:17;2779:79;:::i;:::-;2770:88;;2653:211;;;;;:::o;2870:139::-;;2954:6;2941:20;2932:29;;2970:33;2997:5;2970:33;:::i;:::-;2922:87;;;;:::o;3015:143::-;;3103:6;3097:13;3088:22;;3119:33;3146:5;3119:33;:::i;:::-;3078:80;;;;:::o;3164:262::-;;3272:2;3260:9;3251:7;3247:23;3243:32;3240:2;;;3288:1;3285;3278:12;3240:2;3331:1;3356:53;3401:7;3392:6;3381:9;3377:22;3356:53;:::i;:::-;3346:63;;3302:117;3230:196;;;;:::o;3432:407::-;;;3557:2;3545:9;3536:7;3532:23;3528:32;3525:2;;;3573:1;3570;3563:12;3525:2;3616:1;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3587:117;3743:2;3769:53;3814:7;3805:6;3794:9;3790:22;3769:53;:::i;:::-;3759:63;;3714:118;3515:324;;;;;:::o;3845:552::-;;;;3987:2;3975:9;3966:7;3962:23;3958:32;3955:2;;;4003:1;4000;3993:12;3955:2;4046:1;4071:53;4116:7;4107:6;4096:9;4092:22;4071:53;:::i;:::-;4061:63;;4017:117;4173:2;4199:53;4244:7;4235:6;4224:9;4220:22;4199:53;:::i;:::-;4189:63;;4144:118;4301:2;4327:53;4372:7;4363:6;4352:9;4348:22;4327:53;:::i;:::-;4317:63;;4272:118;3945:452;;;;;:::o;4403:809::-;;;;;4571:3;4559:9;4550:7;4546:23;4542:33;4539:2;;;4588:1;4585;4578:12;4539:2;4631:1;4656:53;4701:7;4692:6;4681:9;4677:22;4656:53;:::i;:::-;4646:63;;4602:117;4758:2;4784:53;4829:7;4820:6;4809:9;4805:22;4784:53;:::i;:::-;4774:63;;4729:118;4886:2;4912:53;4957:7;4948:6;4937:9;4933:22;4912:53;:::i;:::-;4902:63;;4857:118;5042:2;5031:9;5027:18;5014:32;5073:18;5065:6;5062:30;5059:2;;;5105:1;5102;5095:12;5059:2;5133:62;5187:7;5178:6;5167:9;5163:22;5133:62;:::i;:::-;5123:72;;4985:220;4529:683;;;;;;;:::o;5218:401::-;;;5340:2;5328:9;5319:7;5315:23;5311:32;5308:2;;;5356:1;5353;5346:12;5308:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5526:2;5552:50;5594:7;5585:6;5574:9;5570:22;5552:50;:::i;:::-;5542:60;;5497:115;5298:321;;;;;:::o;5625:407::-;;;5750:2;5738:9;5729:7;5725:23;5721:32;5718:2;;;5766:1;5763;5756:12;5718:2;5809:1;5834:53;5879:7;5870:6;5859:9;5855:22;5834:53;:::i;:::-;5824:63;;5780:117;5936:2;5962:53;6007:7;5998:6;5987:9;5983:22;5962:53;:::i;:::-;5952:63;;5907:118;5708:324;;;;;:::o;6038:420::-;;6182:2;6170:9;6161:7;6157:23;6153:32;6150:2;;;6198:1;6195;6188:12;6150:2;6262:1;6251:9;6247:17;6241:24;6292:18;6284:6;6281:30;6278:2;;;6324:1;6321;6314:12;6278:2;6352:89;6433:7;6424:6;6413:9;6409:22;6352:89;:::i;:::-;6342:99;;6212:239;6140:318;;;;:::o;6464:260::-;;6571:2;6559:9;6550:7;6546:23;6542:32;6539:2;;;6587:1;6584;6577:12;6539:2;6630:1;6655:52;6699:7;6690:6;6679:9;6675:22;6655:52;:::i;:::-;6645:62;;6601:116;6529:195;;;;:::o;6730:282::-;;6848:2;6836:9;6827:7;6823:23;6819:32;6816:2;;;6864:1;6861;6854:12;6816:2;6907:1;6932:63;6987:7;6978:6;6967:9;6963:22;6932:63;:::i;:::-;6922:73;;6878:127;6806:206;;;;:::o;7018:375::-;;7136:2;7124:9;7115:7;7111:23;7107:32;7104:2;;;7152:1;7149;7142:12;7104:2;7223:1;7212:9;7208:17;7195:31;7253:18;7245:6;7242:30;7239:2;;;7285:1;7282;7275:12;7239:2;7313:63;7368:7;7359:6;7348:9;7344:22;7313:63;:::i;:::-;7303:73;;7166:220;7094:299;;;;:::o;7399:262::-;;7507:2;7495:9;7486:7;7482:23;7478:32;7475:2;;;7523:1;7520;7513:12;7475:2;7566:1;7591:53;7636:7;7627:6;7616:9;7612:22;7591:53;:::i;:::-;7581:63;;7537:117;7465:196;;;;:::o;7667:179::-;;7757:46;7799:3;7791:6;7757:46;:::i;:::-;7835:4;7830:3;7826:14;7812:28;;7747:99;;;;:::o;7852:118::-;7939:24;7957:5;7939:24;:::i;:::-;7934:3;7927:37;7917:53;;:::o;8006:732::-;;8154:54;8202:5;8154:54;:::i;:::-;8224:86;8303:6;8298:3;8224:86;:::i;:::-;8217:93;;8334:56;8384:5;8334:56;:::i;:::-;8413:7;8444:1;8429:284;8454:6;8451:1;8448:13;8429:284;;;8530:6;8524:13;8557:63;8616:3;8601:13;8557:63;:::i;:::-;8550:70;;8643:60;8696:6;8643:60;:::i;:::-;8633:70;;8489:224;8476:1;8473;8469:9;8464:14;;8429:284;;;8433:14;8729:3;8722:10;;8130:608;;;;;;;:::o;8744:109::-;8825:21;8840:5;8825:21;:::i;:::-;8820:3;8813:34;8803:50;;:::o;8859:360::-;;8973:38;9005:5;8973:38;:::i;:::-;9027:70;9090:6;9085:3;9027:70;:::i;:::-;9020:77;;9106:52;9151:6;9146:3;9139:4;9132:5;9128:16;9106:52;:::i;:::-;9183:29;9205:6;9183:29;:::i;:::-;9178:3;9174:39;9167:46;;8949:270;;;;;:::o;9225:364::-;;9341:39;9374:5;9341:39;:::i;:::-;9396:71;9460:6;9455:3;9396:71;:::i;:::-;9389:78;;9476:52;9521:6;9516:3;9509:4;9502:5;9498:16;9476:52;:::i;:::-;9553:29;9575:6;9553:29;:::i;:::-;9548:3;9544:39;9537:46;;9317:272;;;;;:::o;9595:377::-;;9729:39;9762:5;9729:39;:::i;:::-;9784:89;9866:6;9861:3;9784:89;:::i;:::-;9777:96;;9882:52;9927:6;9922:3;9915:4;9908:5;9904:16;9882:52;:::i;:::-;9959:6;9954:3;9950:16;9943:23;;9705:267;;;;;:::o;9978:327::-;;10141:67;10205:2;10200:3;10141:67;:::i;:::-;10134:74;;10238:31;10234:1;10229:3;10225:11;10218:52;10296:2;10291:3;10287:12;10280:19;;10124:181;;;:::o;10311:317::-;;10474:67;10538:2;10533:3;10474:67;:::i;:::-;10467:74;;10571:21;10567:1;10562:3;10558:11;10551:42;10619:2;10614:3;10610:12;10603:19;;10457:171;;;:::o;10634:375::-;;10797:67;10861:2;10856:3;10797:67;:::i;:::-;10790:74;;10894:34;10890:1;10885:3;10881:11;10874:55;10960:13;10955:2;10950:3;10946:12;10939:35;11000:2;10995:3;10991:12;10984:19;;10780:229;;;:::o;11015:382::-;;11178:67;11242:2;11237:3;11178:67;:::i;:::-;11171:74;;11275:34;11271:1;11266:3;11262:11;11255:55;11341:20;11336:2;11331:3;11327:12;11320:42;11388:2;11383:3;11379:12;11372:19;;11161:236;;;:::o;11403:370::-;;11566:67;11630:2;11625:3;11566:67;:::i;:::-;11559:74;;11663:34;11659:1;11654:3;11650:11;11643:55;11729:8;11724:2;11719:3;11715:12;11708:30;11764:2;11759:3;11755:12;11748:19;;11549:224;;;:::o;11779:326::-;;11942:67;12006:2;12001:3;11942:67;:::i;:::-;11935:74;;12039:30;12035:1;12030:3;12026:11;12019:51;12096:2;12091:3;12087:12;12080:19;;11925:180;;;:::o;12111:311::-;;12274:67;12338:2;12333:3;12274:67;:::i;:::-;12267:74;;12371:15;12367:1;12362:3;12358:11;12351:36;12413:2;12408:3;12404:12;12397:19;;12257:165;;;:::o;12428:368::-;;12591:67;12655:2;12650:3;12591:67;:::i;:::-;12584:74;;12688:34;12684:1;12679:3;12675:11;12668:55;12754:6;12749:2;12744:3;12740:12;12733:28;12787:2;12782:3;12778:12;12771:19;;12574:222;;;:::o;12802:323::-;;12965:67;13029:2;13024:3;12965:67;:::i;:::-;12958:74;;13062:27;13058:1;13053:3;13049:11;13042:48;13116:2;13111:3;13107:12;13100:19;;12948:177;;;:::o;13131:376::-;;13294:67;13358:2;13353:3;13294:67;:::i;:::-;13287:74;;13391:34;13387:1;13382:3;13378:11;13371:55;13457:14;13452:2;13447:3;13443:12;13436:36;13498:2;13493:3;13489:12;13482:19;;13277:230;;;:::o;13513:388::-;;13676:67;13740:2;13735:3;13676:67;:::i;:::-;13669:74;;13773:34;13769:1;13764:3;13760:11;13753:55;13839:26;13834:2;13829:3;13825:12;13818:48;13892:2;13887:3;13883:12;13876:19;;13659:242;;;:::o;13907:374::-;;14070:67;14134:2;14129:3;14070:67;:::i;:::-;14063:74;;14167:34;14163:1;14158:3;14154:11;14147:55;14233:12;14228:2;14223:3;14219:12;14212:34;14272:2;14267:3;14263:12;14256:19;;14053:228;;;:::o;14287:373::-;;14450:67;14514:2;14509:3;14450:67;:::i;:::-;14443:74;;14547:34;14543:1;14538:3;14534:11;14527:55;14613:11;14608:2;14603:3;14599:12;14592:33;14651:2;14646:3;14642:12;14635:19;;14433:227;;;:::o;14666:330::-;;14829:67;14893:2;14888:3;14829:67;:::i;:::-;14822:74;;14926:34;14922:1;14917:3;14913:11;14906:55;14987:2;14982:3;14978:12;14971:19;;14812:184;;;:::o;15002:376::-;;15165:67;15229:2;15224:3;15165:67;:::i;:::-;15158:74;;15262:34;15258:1;15253:3;15249:11;15242:55;15328:14;15323:2;15318:3;15314:12;15307:36;15369:2;15364:3;15360:12;15353:19;;15148:230;;;:::o;15384:330::-;;15547:67;15611:2;15606:3;15547:67;:::i;:::-;15540:74;;15644:34;15640:1;15635:3;15631:11;15624:55;15705:2;15700:3;15696:12;15689:19;;15530:184;;;:::o;15720:373::-;;15883:67;15947:2;15942:3;15883:67;:::i;:::-;15876:74;;15980:34;15976:1;15971:3;15967:11;15960:55;16046:11;16041:2;16036:3;16032:12;16025:33;16084:2;16079:3;16075:12;16068:19;;15866:227;;;:::o;16099:379::-;;16262:67;16326:2;16321:3;16262:67;:::i;:::-;16255:74;;16359:34;16355:1;16350:3;16346:11;16339:55;16425:17;16420:2;16415:3;16411:12;16404:39;16469:2;16464:3;16460:12;16453:19;;16245:233;;;:::o;16484:315::-;;16647:67;16711:2;16706:3;16647:67;:::i;:::-;16640:74;;16744:19;16740:1;16735:3;16731:11;16724:40;16790:2;16785:3;16781:12;16774:19;;16630:169;;;:::o;16805:365::-;;16968:67;17032:2;17027:3;16968:67;:::i;:::-;16961:74;;17065:34;17061:1;17056:3;17052:11;17045:55;17131:3;17126:2;17121:3;17117:12;17110:25;17161:2;17156:3;17152:12;17145:19;;16951:219;;;:::o;17176:381::-;;17339:67;17403:2;17398:3;17339:67;:::i;:::-;17332:74;;17436:34;17432:1;17427:3;17423:11;17416:55;17502:19;17497:2;17492:3;17488:12;17481:41;17548:2;17543:3;17539:12;17532:19;;17322:235;;;:::o;17563:376::-;;17726:67;17790:2;17785:3;17726:67;:::i;:::-;17719:74;;17823:34;17819:1;17814:3;17810:11;17803:55;17889:14;17884:2;17879:3;17875:12;17868:36;17930:2;17925:3;17921:12;17914:19;;17709:230;;;:::o;17945:322::-;;18108:67;18172:2;18167:3;18108:67;:::i;:::-;18101:74;;18205:26;18201:1;18196:3;18192:11;18185:47;18258:2;18253:3;18249:12;18242:19;;18091:176;;;:::o;18273:330::-;;18436:67;18500:2;18495:3;18436:67;:::i;:::-;18429:74;;18533:34;18529:1;18524:3;18520:11;18513:55;18594:2;18589:3;18585:12;18578:19;;18419:184;;;:::o;18609:108::-;18686:24;18704:5;18686:24;:::i;:::-;18681:3;18674:37;18664:53;;:::o;18723:118::-;18810:24;18828:5;18810:24;:::i;:::-;18805:3;18798:37;18788:53;;:::o;18847:595::-;;19097:95;19188:3;19179:6;19097:95;:::i;:::-;19090:102;;19209:95;19300:3;19291:6;19209:95;:::i;:::-;19202:102;;19321:95;19412:3;19403:6;19321:95;:::i;:::-;19314:102;;19433:3;19426:10;;19079:363;;;;;;:::o;19448:222::-;;19579:2;19568:9;19564:18;19556:26;;19592:71;19660:1;19649:9;19645:17;19636:6;19592:71;:::i;:::-;19546:124;;;;:::o;19676:640::-;;19909:3;19898:9;19894:19;19886:27;;19923:71;19991:1;19980:9;19976:17;19967:6;19923:71;:::i;:::-;20004:72;20072:2;20061:9;20057:18;20048:6;20004:72;:::i;:::-;20086;20154:2;20143:9;20139:18;20130:6;20086:72;:::i;:::-;20205:9;20199:4;20195:20;20190:2;20179:9;20175:18;20168:48;20233:76;20304:4;20295:6;20233:76;:::i;:::-;20225:84;;19876:440;;;;;;;:::o;20322:373::-;;20503:2;20492:9;20488:18;20480:26;;20552:9;20546:4;20542:20;20538:1;20527:9;20523:17;20516:47;20580:108;20683:4;20674:6;20580:108;:::i;:::-;20572:116;;20470:225;;;;:::o;20701:210::-;;20826:2;20815:9;20811:18;20803:26;;20839:65;20901:1;20890:9;20886:17;20877:6;20839:65;:::i;:::-;20793:118;;;;:::o;20917:313::-;;21068:2;21057:9;21053:18;21045:26;;21117:9;21111:4;21107:20;21103:1;21092:9;21088:17;21081:47;21145:78;21218:4;21209:6;21145:78;:::i;:::-;21137:86;;21035:195;;;;:::o;21236:419::-;;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:131;21643:4;21517:131;:::i;:::-;21509:139;;21407:248;;;:::o;21661:419::-;;21865:2;21854:9;21850:18;21842:26;;21914:9;21908:4;21904:20;21900:1;21889:9;21885:17;21878:47;21942:131;22068:4;21942:131;:::i;:::-;21934:139;;21832:248;;;:::o;22086:419::-;;22290:2;22279:9;22275:18;22267:26;;22339:9;22333:4;22329:20;22325:1;22314:9;22310:17;22303:47;22367:131;22493:4;22367:131;:::i;:::-;22359:139;;22257:248;;;:::o;22511:419::-;;22715:2;22704:9;22700:18;22692:26;;22764:9;22758:4;22754:20;22750:1;22739:9;22735:17;22728:47;22792:131;22918:4;22792:131;:::i;:::-;22784:139;;22682:248;;;:::o;22936:419::-;;23140:2;23129:9;23125:18;23117:26;;23189:9;23183:4;23179:20;23175:1;23164:9;23160:17;23153:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;23107:248;;;:::o;23361:419::-;;23565:2;23554:9;23550:18;23542:26;;23614:9;23608:4;23604:20;23600:1;23589:9;23585:17;23578:47;23642:131;23768:4;23642:131;:::i;:::-;23634:139;;23532:248;;;:::o;23786:419::-;;23990:2;23979:9;23975:18;23967:26;;24039:9;24033:4;24029:20;24025:1;24014:9;24010:17;24003:47;24067:131;24193:4;24067:131;:::i;:::-;24059:139;;23957:248;;;:::o;24211:419::-;;24415:2;24404:9;24400:18;24392:26;;24464:9;24458:4;24454:20;24450:1;24439:9;24435:17;24428:47;24492:131;24618:4;24492:131;:::i;:::-;24484:139;;24382:248;;;:::o;24636:419::-;;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24807:248;;;:::o;25061:419::-;;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25232:248;;;:::o;25486:419::-;;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25657:248;;;:::o;25911:419::-;;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;26082:248;;;:::o;26336:419::-;;26540:2;26529:9;26525:18;26517:26;;26589:9;26583:4;26579:20;26575:1;26564:9;26560:17;26553:47;26617:131;26743:4;26617:131;:::i;:::-;26609:139;;26507:248;;;:::o;26761:419::-;;26965:2;26954:9;26950:18;26942:26;;27014:9;27008:4;27004:20;27000:1;26989:9;26985:17;26978:47;27042:131;27168:4;27042:131;:::i;:::-;27034:139;;26932:248;;;:::o;27186:419::-;;27390:2;27379:9;27375:18;27367:26;;27439:9;27433:4;27429:20;27425:1;27414:9;27410:17;27403:47;27467:131;27593:4;27467:131;:::i;:::-;27459:139;;27357:248;;;:::o;27611:419::-;;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27782:248;;;:::o;28036:419::-;;28240:2;28229:9;28225:18;28217:26;;28289:9;28283:4;28279:20;28275:1;28264:9;28260:17;28253:47;28317:131;28443:4;28317:131;:::i;:::-;28309:139;;28207:248;;;:::o;28461:419::-;;28665:2;28654:9;28650:18;28642:26;;28714:9;28708:4;28704:20;28700:1;28689:9;28685:17;28678:47;28742:131;28868:4;28742:131;:::i;:::-;28734:139;;28632:248;;;:::o;28886:419::-;;29090:2;29079:9;29075:18;29067:26;;29139:9;29133:4;29129:20;29125:1;29114:9;29110:17;29103:47;29167:131;29293:4;29167:131;:::i;:::-;29159:139;;29057:248;;;:::o;29311:419::-;;29515:2;29504:9;29500:18;29492:26;;29564:9;29558:4;29554:20;29550:1;29539:9;29535:17;29528:47;29592:131;29718:4;29592:131;:::i;:::-;29584:139;;29482:248;;;:::o;29736:419::-;;29940:2;29929:9;29925:18;29917:26;;29989:9;29983:4;29979:20;29975:1;29964:9;29960:17;29953:47;30017:131;30143:4;30017:131;:::i;:::-;30009:139;;29907:248;;;:::o;30161:419::-;;30365:2;30354:9;30350:18;30342:26;;30414:9;30408:4;30404:20;30400:1;30389:9;30385:17;30378:47;30442:131;30568:4;30442:131;:::i;:::-;30434:139;;30332:248;;;:::o;30586:419::-;;30790:2;30779:9;30775:18;30767:26;;30839:9;30833:4;30829:20;30825:1;30814:9;30810:17;30803:47;30867:131;30993:4;30867:131;:::i;:::-;30859:139;;30757:248;;;:::o;31011:419::-;;31215:2;31204:9;31200:18;31192:26;;31264:9;31258:4;31254:20;31250:1;31239:9;31235:17;31228:47;31292:131;31418:4;31292:131;:::i;:::-;31284:139;;31182:248;;;:::o;31436:222::-;;31567:2;31556:9;31552:18;31544:26;;31580:71;31648:1;31637:9;31633:17;31624:6;31580:71;:::i;:::-;31534:124;;;;:::o;31664:283::-;;31730:2;31724:9;31714:19;;31772:4;31764:6;31760:17;31879:6;31867:10;31864:22;31843:18;31831:10;31828:34;31825:62;31822:2;;;31890:18;;:::i;:::-;31822:2;31930:10;31926:2;31919:22;31704:243;;;;:::o;31953:311::-;;32120:18;32112:6;32109:30;32106:2;;;32142:18;;:::i;:::-;32106:2;32192:4;32184:6;32180:17;32172:25;;32252:4;32246;32242:15;32234:23;;32035:229;;;:::o;32270:331::-;;32421:18;32413:6;32410:30;32407:2;;;32443:18;;:::i;:::-;32407:2;32528:4;32524:9;32517:4;32509:6;32505:17;32501:33;32493:41;;32589:4;32583;32579:15;32571:23;;32336:265;;;:::o;32607:332::-;;32759:18;32751:6;32748:30;32745:2;;;32781:18;;:::i;:::-;32745:2;32866:4;32862:9;32855:4;32847:6;32843:17;32839:33;32831:41;;32927:4;32921;32917:15;32909:23;;32674:265;;;:::o;32945:132::-;;33035:3;33027:11;;33065:4;33060:3;33056:14;33048:22;;33017:60;;;:::o;33083:114::-;;33184:5;33178:12;33168:22;;33157:40;;;:::o;33203:98::-;;33288:5;33282:12;33272:22;;33261:40;;;:::o;33307:99::-;;33393:5;33387:12;33377:22;;33366:40;;;:::o;33412:113::-;;33514:4;33509:3;33505:14;33497:22;;33487:38;;;:::o;33531:184::-;;33664:6;33659:3;33652:19;33704:4;33699:3;33695:14;33680:29;;33642:73;;;;:::o;33721:168::-;;33838:6;33833:3;33826:19;33878:4;33873:3;33869:14;33854:29;;33816:73;;;;:::o;33895:169::-;;34013:6;34008:3;34001:19;34053:4;34048:3;34044:14;34029:29;;33991:73;;;;:::o;34070:148::-;;34209:3;34194:18;;34184:34;;;;:::o;34224:305::-;;34283:20;34301:1;34283:20;:::i;:::-;34278:25;;34317:20;34335:1;34317:20;:::i;:::-;34312:25;;34471:1;34403:66;34399:74;34396:1;34393:81;34390:2;;;34477:18;;:::i;:::-;34390:2;34521:1;34518;34514:9;34507:16;;34268:261;;;;:::o;34535:246::-;;34593:19;34610:1;34593:19;:::i;:::-;34588:24;;34626:19;34643:1;34626:19;:::i;:::-;34621:24;;34723:1;34711:10;34707:18;34704:1;34701:25;34698:2;;;34729:18;;:::i;:::-;34698:2;34773:1;34770;34766:9;34759:16;;34578:203;;;;:::o;34787:185::-;;34844:20;34862:1;34844:20;:::i;:::-;34839:25;;34878:20;34896:1;34878:20;:::i;:::-;34873:25;;34917:1;34907:2;;34922:18;;:::i;:::-;34907:2;34964:1;34961;34957:9;34952:14;;34829:143;;;;:::o;34978:348::-;;35041:20;35059:1;35041:20;:::i;:::-;35036:25;;35075:20;35093:1;35075:20;:::i;:::-;35070:25;;35263:1;35195:66;35191:74;35188:1;35185:81;35180:1;35173:9;35166:17;35162:105;35159:2;;;35270:18;;:::i;:::-;35159:2;35318:1;35315;35311:9;35300:20;;35026:300;;;;:::o;35332:191::-;;35392:20;35410:1;35392:20;:::i;:::-;35387:25;;35426:20;35444:1;35426:20;:::i;:::-;35421:25;;35465:1;35462;35459:8;35456:2;;;35470:18;;:::i;:::-;35456:2;35515:1;35512;35508:9;35500:17;;35377:146;;;;:::o;35529:96::-;;35595:24;35613:5;35595:24;:::i;:::-;35584:35;;35574:51;;;:::o;35631:90::-;;35708:5;35701:13;35694:21;35683:32;;35673:48;;;:::o;35727:149::-;;35803:66;35796:5;35792:78;35781:89;;35771:105;;;:::o;35882:126::-;;35959:42;35952:5;35948:54;35937:65;;35927:81;;;:::o;36014:77::-;;36080:5;36069:16;;36059:32;;;:::o;36097:93::-;;36173:10;36166:5;36162:22;36151:33;;36141:49;;;:::o;36196:154::-;36280:6;36275:3;36270;36257:30;36342:1;36333:6;36328:3;36324:16;36317:27;36247:103;;;:::o;36356:307::-;36424:1;36434:113;36448:6;36445:1;36442:13;36434:113;;;36533:1;36528:3;36524:11;36518:18;36514:1;36509:3;36505:11;36498:39;36470:2;36467:1;36463:10;36458:15;;36434:113;;;36565:6;36562:1;36559:13;36556:2;;;36645:1;36636:6;36631:3;36627:16;36620:27;36556:2;36405:258;;;;:::o;36669:320::-;;36750:1;36744:4;36740:12;36730:22;;36797:1;36791:4;36787:12;36818:18;36808:2;;36874:4;36866:6;36862:17;36852:27;;36808:2;36936;36928:6;36925:14;36905:18;36902:38;36899:2;;;36955:18;;:::i;:::-;36899:2;36720:269;;;;:::o;36995:233::-;;37057:24;37075:5;37057:24;:::i;:::-;37048:33;;37103:66;37096:5;37093:77;37090:2;;;37173:18;;:::i;:::-;37090:2;37220:1;37213:5;37209:13;37202:20;;37038:190;;;:::o;37234:176::-;;37283:20;37301:1;37283:20;:::i;:::-;37278:25;;37317:20;37335:1;37317:20;:::i;:::-;37312:25;;37356:1;37346:2;;37361:18;;:::i;:::-;37346:2;37402:1;37399;37395:9;37390:14;;37268:142;;;;:::o;37416:180::-;37464:77;37461:1;37454:88;37561:4;37558:1;37551:15;37585:4;37582:1;37575:15;37602:180;37650:77;37647:1;37640:88;37747:4;37744:1;37737:15;37771:4;37768:1;37761:15;37788:180;37836:77;37833:1;37826:88;37933:4;37930:1;37923:15;37957:4;37954:1;37947:15;37974:180;38022:77;38019:1;38012:88;38119:4;38116:1;38109:15;38143:4;38140:1;38133:15;38160:102;;38252:2;38248:7;38243:2;38236:5;38232:14;38228:28;38218:38;;38208:54;;;:::o;38268:122::-;38341:24;38359:5;38341:24;:::i;:::-;38334:5;38331:35;38321:2;;38380:1;38377;38370:12;38321:2;38311:79;:::o;38396:116::-;38466:21;38481:5;38466:21;:::i;:::-;38459:5;38456:32;38446:2;;38502:1;38499;38492:12;38446:2;38436:76;:::o;38518:120::-;38590:23;38607:5;38590:23;:::i;:::-;38583:5;38580:34;38570:2;;38628:1;38625;38618:12;38570:2;38560:78;:::o;38644:122::-;38717:24;38735:5;38717:24;:::i;:::-;38710:5;38707:35;38697:2;;38756:1;38753;38746:12;38697:2;38687:79;:::o
Swarm Source
ipfs://6c916442bc257a2a4d668fab3df3aeff44eaab58490e33df3f6b05e8adf9371d
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.