ERC-721
Overview
Max Total Supply
1,860 FC
Holders
930
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 FCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FC
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-24 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @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 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); } /** * @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 Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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; } } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract FC is ERC721A, Ownable { using Strings for uint256; uint256 public constant FREE_SUPPLY = 6666; Stage public stage = Stage.Start; string public baseURI; string internal baseExtension = ".json"; uint256 freeSupply; enum Stage { Pause, Start } event StageChanged(Stage from, Stage to); constructor() ERC721A("Fortune Cat", "FC") {} function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "FC: not exist"); string memory currentBaseURI = _baseURI(); return ( bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "" ); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setStage(Stage _stage) external onlyOwner { require(stage != _stage, "FC: invalid stage."); Stage prevStage = stage; stage = _stage; emit StageChanged(prevStage, stage); } function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } function freeMint() external { require(stage == Stage.Start, "FC: mint is pause."); require(freeSupply < FREE_SUPPLY, "FC: free mint complete."); freeSupply += 1; _safeMint(msg.sender, 1); } function setBaseExtension(string memory _extension) external onlyOwner { baseExtension = _extension; } function withdrawAll() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No money"); (bool success, ) = payable(msg.sender).call{value: balance}(""); require(success, "Transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"enum FC.Stage","name":"from","type":"uint8"},{"indexed":false,"internalType":"enum FC.Stage","name":"to","type":"uint8"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","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":"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":"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":"_extension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FC.Stage","name":"_stage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum FC.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600860146101000a81548160ff021916908360018111156200002d576200002c62000323565b5b02179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007f9291906200023d565b503480156200008d57600080fd5b506040518060400160405280600b81526020017f466f7274756e65204361740000000000000000000000000000000000000000008152506040518060400160405280600281526020017f46430000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001129291906200023d565b5080600390805190602001906200012b9291906200023d565b506200013c6200016a60201b60201c565b600081905550505062000164620001586200016f60201b60201c565b6200017760201b60201c565b62000381565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024b90620002ed565b90600052602060002090601f0160209004810192826200026f5760008555620002bb565b82601f106200028a57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002ba5782518255916020019190600101906200029d565b5b509050620002ca9190620002ce565b5090565b5b80821115620002e9576000816000905550600101620002cf565b5090565b600060028204905060018216806200030657607f821691505b602082108114156200031d576200031c62000352565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61356a80620003916000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063b88d4fde11610097578063ce3cd99711610071578063ce3cd99714610400578063da3ef23f1461041c578063e985e9c514610438578063f2fde38b1461046857610173565b8063b88d4fde14610396578063c040e6b8146103b2578063c87b56dd146103d057610173565b8063715018a61461030c578063853828b6146103165780638da5cb5b1461032057806395d89b411461033e5780639858cf191461035c578063a22cb4651461037a57610173565b806342842e0e1161013057806342842e0e1461024c57806355f804b3146102685780635b70ea9f146102845780636352211e1461028e5780636c0360eb146102be57806370a08231146102dc57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906128c8565b610484565b60405161019f9190612d0b565b60405180910390f35b6101b0610566565b6040516101bd9190612d6a565b60405180910390f35b6101e060048036038101906101db9190612998565b6105f8565b6040516101ed9190612ca4565b60405180910390f35b610210600480360381019061020b9190612888565b610674565b005b61021a61077f565b6040516102279190612e8c565b60405180910390f35b61024a60048036038101906102459190612772565b610796565b005b61026660048036038101906102619190612772565b6107a6565b005b610282600480360381019061027d919061294f565b6107c6565b005b61028c61085c565b005b6102a860048036038101906102a39190612998565b61093e565b6040516102b59190612ca4565b60405180910390f35b6102c6610954565b6040516102d39190612d6a565b60405180910390f35b6102f660048036038101906102f19190612705565b6109e2565b6040516103039190612e8c565b60405180910390f35b610314610ab2565b005b61031e610b3a565b005b610328610cae565b6040516103359190612ca4565b60405180910390f35b610346610cd8565b6040516103539190612d6a565b60405180910390f35b610364610d6a565b6040516103719190612e8c565b60405180910390f35b610394600480360381019061038f9190612848565b610d70565b005b6103b060048036038101906103ab91906127c5565b610ee8565b005b6103ba610f64565b6040516103c79190612d26565b60405180910390f35b6103ea60048036038101906103e59190612998565b610f77565b6040516103f79190612d6a565b60405180910390f35b61041a60048036038101906104159190612922565b611021565b005b6104366004803603810190610431919061294f565b61119d565b005b610452600480360381019061044d9190612732565b611233565b60405161045f9190612d0b565b60405180910390f35b610482600480360381019061047d9190612705565b6112c7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055f575061055e826113bf565b5b9050919050565b60606002805461057590613127565b80601f01602080910402602001604051908101604052809291908181526020018280546105a190613127565b80156105ee5780601f106105c3576101008083540402835291602001916105ee565b820191906000526020600020905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b600061060382611429565b610639576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067f8261093e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611477565b73ffffffffffffffffffffffffffffffffffffffff1614158015610738575061073681610731611477565b611233565b155b1561076f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61077a83838361147f565b505050565b6000610789611531565b6001546000540303905090565b6107a1838383611536565b505050565b6107c183838360405180602001604052806000815250610ee8565b505050565b6107ce611477565b73ffffffffffffffffffffffffffffffffffffffff166107ec610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612e4c565b60405180910390fd5b80600990805190602001906108589291906124c1565b5050565b60018081111561086f5761086e613262565b5b600860149054906101000a900460ff16600181111561089157610890613262565b5b146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e0c565b60405180910390fd5b611a0a600b5410610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612e2c565b60405180910390fd5b6001600b600082825461092a9190612f91565b9250508190555061093c3360016119ec565b565b600061094982611a0a565b600001519050919050565b6009805461096190613127565b80601f016020809104026020016040519081016040528092919081815260200182805461098d90613127565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610aba611477565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e4c565b60405180910390fd5b610b386000611c99565b565b610b42611477565b73ffffffffffffffffffffffffffffffffffffffff16610b60610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612e4c565b60405180910390fd5b600047905060008111610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612dec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c2490612c8f565b60006040518083038185875af1925050503d8060008114610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b5050905080610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612dcc565b60405180910390fd5b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ce790613127565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1390613127565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b5050505050905090565b611a0a81565b610d78611477565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610dea611477565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e97611477565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610edc9190612d0b565b60405180910390a35050565b610ef3848484611536565b610f128373ffffffffffffffffffffffffffffffffffffffff16611d5f565b8015610f275750610f2584848484611d82565b155b15610f5e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600860149054906101000a900460ff1681565b6060610f8282611429565b610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612d8c565b60405180910390fd5b6000610fcb611ee2565b90506000815111610feb5760405180602001604052806000815250611019565b80610ff584611f74565b600a60405160200161100993929190612c5e565b6040516020818303038152906040525b915050919050565b611029611477565b73ffffffffffffffffffffffffffffffffffffffff16611047610cae565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490612e4c565b60405180910390fd5b8060018111156110b0576110af613262565b5b600860149054906101000a900460ff1660018111156110d2576110d1613262565b5b1415611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612e6c565b60405180910390fd5b6000600860149054906101000a900460ff16905081600860146101000a81548160ff0219169083600181111561114c5761114b613262565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600860149054906101000a900460ff16604051611191929190612d41565b60405180910390a15050565b6111a5611477565b73ffffffffffffffffffffffffffffffffffffffff166111c3610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612e4c565b60405180910390fd5b80600a908051906020019061122f9291906124c1565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cf611477565b73ffffffffffffffffffffffffffffffffffffffff166112ed610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90612e4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90612dac565b60405180910390fd5b6113bc81611c99565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611434611531565b11158015611443575060005482105b8015611470575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061154182611a0a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146115ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115cd611477565b73ffffffffffffffffffffffffffffffffffffffff1614806115fc57506115fb856115f6611477565b611233565b5b80611641575061160a611477565b73ffffffffffffffffffffffffffffffffffffffff16611629846105f8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061167a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee85858560016120d5565b6116fa6000848761147f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a57600054821461197957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e585858560016120db565b5050505050565b611a068282604051806020016040528060008152506120e1565b5050565b611a12612547565b600082905080611a20611531565b11158015611a2f575060005481105b15611c62576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c6057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b44578092505050611c94565b5b600115611c5f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a578092505050611c94565b611b45565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da8611477565b8786866040518563ffffffff1660e01b8152600401611dca9493929190612cbf565b602060405180830381600087803b158015611de457600080fd5b505af1925050508015611e1557506040513d601f19601f82011682018060405250810190611e1291906128f5565b60015b611e8f573d8060008114611e45576040519150601f19603f3d011682016040523d82523d6000602084013e611e4a565b606091505b50600081511415611e87576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ef190613127565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90613127565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b5050505050905090565b60606000821415611fbc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d0565b600082905060005b60008214611fee578080611fd79061318a565b915050600a82611fe79190612fe7565b9150611fc4565b60008167ffffffffffffffff81111561200a576120096132ef565b5b6040519080825280601f01601f19166020018201604052801561203c5781602001600182028036833780820191505090505b5090505b600085146120c9576001826120559190613018565b9150600a8561206491906131d3565b60306120709190612f91565b60f81b818381518110612086576120856132c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c29190612fe7565b9450612040565b8093505050505b919050565b50505050565b50505050565b6120ee83838360016120f3565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612160576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561219b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a860008683876120d5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561237257506123718773ffffffffffffffffffffffffffffffffffffffff16611d5f565b5b15612438575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e76000888480600101955088611d82565b61241d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561237857826000541461243357600080fd5b6124a4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612439575b8160008190555050506124ba60008683876120db565b5050505050565b8280546124cd90613127565b90600052602060002090601f0160209004810192826124ef5760008555612536565b82601f1061250857805160ff1916838001178555612536565b82800160010185558215612536579182015b8281111561253557825182559160200191906001019061251a565b5b509050612543919061258a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156125a357600081600090555060010161258b565b5090565b60006125ba6125b584612ecc565b612ea7565b9050828152602081018484840111156125d6576125d5613323565b5b6125e18482856130e5565b509392505050565b60006125fc6125f784612efd565b612ea7565b90508281526020810184848401111561261857612617613323565b5b6126238482856130e5565b509392505050565b60008135905061263a816134c8565b92915050565b60008135905061264f816134df565b92915050565b600081359050612664816134f6565b92915050565b600081519050612679816134f6565b92915050565b600082601f8301126126945761269361331e565b5b81356126a48482602086016125a7565b91505092915050565b6000813590506126bc8161350d565b92915050565b600082601f8301126126d7576126d661331e565b5b81356126e78482602086016125e9565b91505092915050565b6000813590506126ff8161351d565b92915050565b60006020828403121561271b5761271a61332d565b5b60006127298482850161262b565b91505092915050565b600080604083850312156127495761274861332d565b5b60006127578582860161262b565b92505060206127688582860161262b565b9150509250929050565b60008060006060848603121561278b5761278a61332d565b5b60006127998682870161262b565b93505060206127aa8682870161262b565b92505060406127bb868287016126f0565b9150509250925092565b600080600080608085870312156127df576127de61332d565b5b60006127ed8782880161262b565b94505060206127fe8782880161262b565b935050604061280f878288016126f0565b925050606085013567ffffffffffffffff8111156128305761282f613328565b5b61283c8782880161267f565b91505092959194509250565b6000806040838503121561285f5761285e61332d565b5b600061286d8582860161262b565b925050602061287e85828601612640565b9150509250929050565b6000806040838503121561289f5761289e61332d565b5b60006128ad8582860161262b565b92505060206128be858286016126f0565b9150509250929050565b6000602082840312156128de576128dd61332d565b5b60006128ec84828501612655565b91505092915050565b60006020828403121561290b5761290a61332d565b5b60006129198482850161266a565b91505092915050565b6000602082840312156129385761293761332d565b5b6000612946848285016126ad565b91505092915050565b6000602082840312156129655761296461332d565b5b600082013567ffffffffffffffff81111561298357612982613328565b5b61298f848285016126c2565b91505092915050565b6000602082840312156129ae576129ad61332d565b5b60006129bc848285016126f0565b91505092915050565b6129ce8161304c565b82525050565b6129dd8161305e565b82525050565b60006129ee82612f43565b6129f88185612f59565b9350612a088185602086016130f4565b612a1181613332565b840191505092915050565b612a25816130d3565b82525050565b6000612a3682612f4e565b612a408185612f75565b9350612a508185602086016130f4565b612a5981613332565b840191505092915050565b6000612a6f82612f4e565b612a798185612f86565b9350612a898185602086016130f4565b80840191505092915050565b60008154612aa281613127565b612aac8186612f86565b94506001821660008114612ac75760018114612ad857612b0b565b60ff19831686528186019350612b0b565b612ae185612f2e565b60005b83811015612b0357815481890152600182019150602081019050612ae4565b838801955050505b50505092915050565b6000612b21600d83612f75565b9150612b2c82613343565b602082019050919050565b6000612b44602683612f75565b9150612b4f8261336c565b604082019050919050565b6000612b67600f83612f75565b9150612b72826133bb565b602082019050919050565b6000612b8a600883612f75565b9150612b95826133e4565b602082019050919050565b6000612bad601283612f75565b9150612bb88261340d565b602082019050919050565b6000612bd0601783612f75565b9150612bdb82613436565b602082019050919050565b6000612bf3602083612f75565b9150612bfe8261345f565b602082019050919050565b6000612c16600083612f6a565b9150612c2182613488565b600082019050919050565b6000612c39601283612f75565b9150612c448261348b565b602082019050919050565b612c58816130c9565b82525050565b6000612c6a8286612a64565b9150612c768285612a64565b9150612c828284612a95565b9150819050949350505050565b6000612c9a82612c09565b9150819050919050565b6000602082019050612cb960008301846129c5565b92915050565b6000608082019050612cd460008301876129c5565b612ce160208301866129c5565b612cee6040830185612c4f565b8181036060830152612d0081846129e3565b905095945050505050565b6000602082019050612d2060008301846129d4565b92915050565b6000602082019050612d3b6000830184612a1c565b92915050565b6000604082019050612d566000830185612a1c565b612d636020830184612a1c565b9392505050565b60006020820190508181036000830152612d848184612a2b565b905092915050565b60006020820190508181036000830152612da581612b14565b9050919050565b60006020820190508181036000830152612dc581612b37565b9050919050565b60006020820190508181036000830152612de581612b5a565b9050919050565b60006020820190508181036000830152612e0581612b7d565b9050919050565b60006020820190508181036000830152612e2581612ba0565b9050919050565b60006020820190508181036000830152612e4581612bc3565b9050919050565b60006020820190508181036000830152612e6581612be6565b9050919050565b60006020820190508181036000830152612e8581612c2c565b9050919050565b6000602082019050612ea16000830184612c4f565b92915050565b6000612eb1612ec2565b9050612ebd8282613159565b919050565b6000604051905090565b600067ffffffffffffffff821115612ee757612ee66132ef565b5b612ef082613332565b9050602081019050919050565b600067ffffffffffffffff821115612f1857612f176132ef565b5b612f2182613332565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9c826130c9565b9150612fa7836130c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fdc57612fdb613204565b5b828201905092915050565b6000612ff2826130c9565b9150612ffd836130c9565b92508261300d5761300c613233565b5b828204905092915050565b6000613023826130c9565b915061302e836130c9565b92508282101561304157613040613204565b5b828203905092915050565b6000613057826130a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506130a4826134b4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de82613096565b9050919050565b82818337600083830152505050565b60005b838110156131125780820151818401526020810190506130f7565b83811115613121576000848401525b50505050565b6000600282049050600182168061313f57607f821691505b6020821081141561315357613152613291565b5b50919050565b61316282613332565b810181811067ffffffffffffffff82111715613181576131806132ef565b5b80604052505050565b6000613195826130c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c8576131c7613204565b5b600182019050919050565b60006131de826130c9565b91506131e9836130c9565b9250826131f9576131f8613233565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f46433a206e6f7420657869737400000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b7f46433a206d696e742069732070617573652e0000000000000000000000000000600082015250565b7f46433a2066726565206d696e7420636f6d706c6574652e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f46433a20696e76616c69642073746167652e0000000000000000000000000000600082015250565b600281106134c5576134c4613262565b5b50565b6134d18161304c565b81146134dc57600080fd5b50565b6134e88161305e565b81146134f357600080fd5b50565b6134ff8161306a565b811461350a57600080fd5b50565b6002811061351a57600080fd5b50565b613526816130c9565b811461353157600080fd5b5056fea264697066735822122023ab73320c4b47c857c8dcd67d424a12f3d4a22d9fcf336bac48dd99cbbd68e164736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063b88d4fde11610097578063ce3cd99711610071578063ce3cd99714610400578063da3ef23f1461041c578063e985e9c514610438578063f2fde38b1461046857610173565b8063b88d4fde14610396578063c040e6b8146103b2578063c87b56dd146103d057610173565b8063715018a61461030c578063853828b6146103165780638da5cb5b1461032057806395d89b411461033e5780639858cf191461035c578063a22cb4651461037a57610173565b806342842e0e1161013057806342842e0e1461024c57806355f804b3146102685780635b70ea9f146102845780636352211e1461028e5780636c0360eb146102be57806370a08231146102dc57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906128c8565b610484565b60405161019f9190612d0b565b60405180910390f35b6101b0610566565b6040516101bd9190612d6a565b60405180910390f35b6101e060048036038101906101db9190612998565b6105f8565b6040516101ed9190612ca4565b60405180910390f35b610210600480360381019061020b9190612888565b610674565b005b61021a61077f565b6040516102279190612e8c565b60405180910390f35b61024a60048036038101906102459190612772565b610796565b005b61026660048036038101906102619190612772565b6107a6565b005b610282600480360381019061027d919061294f565b6107c6565b005b61028c61085c565b005b6102a860048036038101906102a39190612998565b61093e565b6040516102b59190612ca4565b60405180910390f35b6102c6610954565b6040516102d39190612d6a565b60405180910390f35b6102f660048036038101906102f19190612705565b6109e2565b6040516103039190612e8c565b60405180910390f35b610314610ab2565b005b61031e610b3a565b005b610328610cae565b6040516103359190612ca4565b60405180910390f35b610346610cd8565b6040516103539190612d6a565b60405180910390f35b610364610d6a565b6040516103719190612e8c565b60405180910390f35b610394600480360381019061038f9190612848565b610d70565b005b6103b060048036038101906103ab91906127c5565b610ee8565b005b6103ba610f64565b6040516103c79190612d26565b60405180910390f35b6103ea60048036038101906103e59190612998565b610f77565b6040516103f79190612d6a565b60405180910390f35b61041a60048036038101906104159190612922565b611021565b005b6104366004803603810190610431919061294f565b61119d565b005b610452600480360381019061044d9190612732565b611233565b60405161045f9190612d0b565b60405180910390f35b610482600480360381019061047d9190612705565b6112c7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055f575061055e826113bf565b5b9050919050565b60606002805461057590613127565b80601f01602080910402602001604051908101604052809291908181526020018280546105a190613127565b80156105ee5780601f106105c3576101008083540402835291602001916105ee565b820191906000526020600020905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b600061060382611429565b610639576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067f8261093e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611477565b73ffffffffffffffffffffffffffffffffffffffff1614158015610738575061073681610731611477565b611233565b155b1561076f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61077a83838361147f565b505050565b6000610789611531565b6001546000540303905090565b6107a1838383611536565b505050565b6107c183838360405180602001604052806000815250610ee8565b505050565b6107ce611477565b73ffffffffffffffffffffffffffffffffffffffff166107ec610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612e4c565b60405180910390fd5b80600990805190602001906108589291906124c1565b5050565b60018081111561086f5761086e613262565b5b600860149054906101000a900460ff16600181111561089157610890613262565b5b146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e0c565b60405180910390fd5b611a0a600b5410610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612e2c565b60405180910390fd5b6001600b600082825461092a9190612f91565b9250508190555061093c3360016119ec565b565b600061094982611a0a565b600001519050919050565b6009805461096190613127565b80601f016020809104026020016040519081016040528092919081815260200182805461098d90613127565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610aba611477565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e4c565b60405180910390fd5b610b386000611c99565b565b610b42611477565b73ffffffffffffffffffffffffffffffffffffffff16610b60610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612e4c565b60405180910390fd5b600047905060008111610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612dec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c2490612c8f565b60006040518083038185875af1925050503d8060008114610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b5050905080610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612dcc565b60405180910390fd5b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ce790613127565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1390613127565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b5050505050905090565b611a0a81565b610d78611477565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610dea611477565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e97611477565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610edc9190612d0b565b60405180910390a35050565b610ef3848484611536565b610f128373ffffffffffffffffffffffffffffffffffffffff16611d5f565b8015610f275750610f2584848484611d82565b155b15610f5e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600860149054906101000a900460ff1681565b6060610f8282611429565b610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612d8c565b60405180910390fd5b6000610fcb611ee2565b90506000815111610feb5760405180602001604052806000815250611019565b80610ff584611f74565b600a60405160200161100993929190612c5e565b6040516020818303038152906040525b915050919050565b611029611477565b73ffffffffffffffffffffffffffffffffffffffff16611047610cae565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490612e4c565b60405180910390fd5b8060018111156110b0576110af613262565b5b600860149054906101000a900460ff1660018111156110d2576110d1613262565b5b1415611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612e6c565b60405180910390fd5b6000600860149054906101000a900460ff16905081600860146101000a81548160ff0219169083600181111561114c5761114b613262565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600860149054906101000a900460ff16604051611191929190612d41565b60405180910390a15050565b6111a5611477565b73ffffffffffffffffffffffffffffffffffffffff166111c3610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612e4c565b60405180910390fd5b80600a908051906020019061122f9291906124c1565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cf611477565b73ffffffffffffffffffffffffffffffffffffffff166112ed610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90612e4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90612dac565b60405180910390fd5b6113bc81611c99565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611434611531565b11158015611443575060005482105b8015611470575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061154182611a0a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146115ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115cd611477565b73ffffffffffffffffffffffffffffffffffffffff1614806115fc57506115fb856115f6611477565b611233565b5b80611641575061160a611477565b73ffffffffffffffffffffffffffffffffffffffff16611629846105f8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061167a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee85858560016120d5565b6116fa6000848761147f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a57600054821461197957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e585858560016120db565b5050505050565b611a068282604051806020016040528060008152506120e1565b5050565b611a12612547565b600082905080611a20611531565b11158015611a2f575060005481105b15611c62576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c6057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b44578092505050611c94565b5b600115611c5f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a578092505050611c94565b611b45565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da8611477565b8786866040518563ffffffff1660e01b8152600401611dca9493929190612cbf565b602060405180830381600087803b158015611de457600080fd5b505af1925050508015611e1557506040513d601f19601f82011682018060405250810190611e1291906128f5565b60015b611e8f573d8060008114611e45576040519150601f19603f3d011682016040523d82523d6000602084013e611e4a565b606091505b50600081511415611e87576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ef190613127565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90613127565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b5050505050905090565b60606000821415611fbc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d0565b600082905060005b60008214611fee578080611fd79061318a565b915050600a82611fe79190612fe7565b9150611fc4565b60008167ffffffffffffffff81111561200a576120096132ef565b5b6040519080825280601f01601f19166020018201604052801561203c5781602001600182028036833780820191505090505b5090505b600085146120c9576001826120559190613018565b9150600a8561206491906131d3565b60306120709190612f91565b60f81b818381518110612086576120856132c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c29190612fe7565b9450612040565b8093505050505b919050565b50505050565b50505050565b6120ee83838360016120f3565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612160576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561219b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a860008683876120d5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561237257506123718773ffffffffffffffffffffffffffffffffffffffff16611d5f565b5b15612438575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e76000888480600101955088611d82565b61241d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561237857826000541461243357600080fd5b6124a4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612439575b8160008190555050506124ba60008683876120db565b5050505050565b8280546124cd90613127565b90600052602060002090601f0160209004810192826124ef5760008555612536565b82601f1061250857805160ff1916838001178555612536565b82800160010185558215612536579182015b8281111561253557825182559160200191906001019061251a565b5b509050612543919061258a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156125a357600081600090555060010161258b565b5090565b60006125ba6125b584612ecc565b612ea7565b9050828152602081018484840111156125d6576125d5613323565b5b6125e18482856130e5565b509392505050565b60006125fc6125f784612efd565b612ea7565b90508281526020810184848401111561261857612617613323565b5b6126238482856130e5565b509392505050565b60008135905061263a816134c8565b92915050565b60008135905061264f816134df565b92915050565b600081359050612664816134f6565b92915050565b600081519050612679816134f6565b92915050565b600082601f8301126126945761269361331e565b5b81356126a48482602086016125a7565b91505092915050565b6000813590506126bc8161350d565b92915050565b600082601f8301126126d7576126d661331e565b5b81356126e78482602086016125e9565b91505092915050565b6000813590506126ff8161351d565b92915050565b60006020828403121561271b5761271a61332d565b5b60006127298482850161262b565b91505092915050565b600080604083850312156127495761274861332d565b5b60006127578582860161262b565b92505060206127688582860161262b565b9150509250929050565b60008060006060848603121561278b5761278a61332d565b5b60006127998682870161262b565b93505060206127aa8682870161262b565b92505060406127bb868287016126f0565b9150509250925092565b600080600080608085870312156127df576127de61332d565b5b60006127ed8782880161262b565b94505060206127fe8782880161262b565b935050604061280f878288016126f0565b925050606085013567ffffffffffffffff8111156128305761282f613328565b5b61283c8782880161267f565b91505092959194509250565b6000806040838503121561285f5761285e61332d565b5b600061286d8582860161262b565b925050602061287e85828601612640565b9150509250929050565b6000806040838503121561289f5761289e61332d565b5b60006128ad8582860161262b565b92505060206128be858286016126f0565b9150509250929050565b6000602082840312156128de576128dd61332d565b5b60006128ec84828501612655565b91505092915050565b60006020828403121561290b5761290a61332d565b5b60006129198482850161266a565b91505092915050565b6000602082840312156129385761293761332d565b5b6000612946848285016126ad565b91505092915050565b6000602082840312156129655761296461332d565b5b600082013567ffffffffffffffff81111561298357612982613328565b5b61298f848285016126c2565b91505092915050565b6000602082840312156129ae576129ad61332d565b5b60006129bc848285016126f0565b91505092915050565b6129ce8161304c565b82525050565b6129dd8161305e565b82525050565b60006129ee82612f43565b6129f88185612f59565b9350612a088185602086016130f4565b612a1181613332565b840191505092915050565b612a25816130d3565b82525050565b6000612a3682612f4e565b612a408185612f75565b9350612a508185602086016130f4565b612a5981613332565b840191505092915050565b6000612a6f82612f4e565b612a798185612f86565b9350612a898185602086016130f4565b80840191505092915050565b60008154612aa281613127565b612aac8186612f86565b94506001821660008114612ac75760018114612ad857612b0b565b60ff19831686528186019350612b0b565b612ae185612f2e565b60005b83811015612b0357815481890152600182019150602081019050612ae4565b838801955050505b50505092915050565b6000612b21600d83612f75565b9150612b2c82613343565b602082019050919050565b6000612b44602683612f75565b9150612b4f8261336c565b604082019050919050565b6000612b67600f83612f75565b9150612b72826133bb565b602082019050919050565b6000612b8a600883612f75565b9150612b95826133e4565b602082019050919050565b6000612bad601283612f75565b9150612bb88261340d565b602082019050919050565b6000612bd0601783612f75565b9150612bdb82613436565b602082019050919050565b6000612bf3602083612f75565b9150612bfe8261345f565b602082019050919050565b6000612c16600083612f6a565b9150612c2182613488565b600082019050919050565b6000612c39601283612f75565b9150612c448261348b565b602082019050919050565b612c58816130c9565b82525050565b6000612c6a8286612a64565b9150612c768285612a64565b9150612c828284612a95565b9150819050949350505050565b6000612c9a82612c09565b9150819050919050565b6000602082019050612cb960008301846129c5565b92915050565b6000608082019050612cd460008301876129c5565b612ce160208301866129c5565b612cee6040830185612c4f565b8181036060830152612d0081846129e3565b905095945050505050565b6000602082019050612d2060008301846129d4565b92915050565b6000602082019050612d3b6000830184612a1c565b92915050565b6000604082019050612d566000830185612a1c565b612d636020830184612a1c565b9392505050565b60006020820190508181036000830152612d848184612a2b565b905092915050565b60006020820190508181036000830152612da581612b14565b9050919050565b60006020820190508181036000830152612dc581612b37565b9050919050565b60006020820190508181036000830152612de581612b5a565b9050919050565b60006020820190508181036000830152612e0581612b7d565b9050919050565b60006020820190508181036000830152612e2581612ba0565b9050919050565b60006020820190508181036000830152612e4581612bc3565b9050919050565b60006020820190508181036000830152612e6581612be6565b9050919050565b60006020820190508181036000830152612e8581612c2c565b9050919050565b6000602082019050612ea16000830184612c4f565b92915050565b6000612eb1612ec2565b9050612ebd8282613159565b919050565b6000604051905090565b600067ffffffffffffffff821115612ee757612ee66132ef565b5b612ef082613332565b9050602081019050919050565b600067ffffffffffffffff821115612f1857612f176132ef565b5b612f2182613332565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9c826130c9565b9150612fa7836130c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fdc57612fdb613204565b5b828201905092915050565b6000612ff2826130c9565b9150612ffd836130c9565b92508261300d5761300c613233565b5b828204905092915050565b6000613023826130c9565b915061302e836130c9565b92508282101561304157613040613204565b5b828203905092915050565b6000613057826130a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506130a4826134b4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de82613096565b9050919050565b82818337600083830152505050565b60005b838110156131125780820151818401526020810190506130f7565b83811115613121576000848401525b50505050565b6000600282049050600182168061313f57607f821691505b6020821081141561315357613152613291565b5b50919050565b61316282613332565b810181811067ffffffffffffffff82111715613181576131806132ef565b5b80604052505050565b6000613195826130c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c8576131c7613204565b5b600182019050919050565b60006131de826130c9565b91506131e9836130c9565b9250826131f9576131f8613233565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f46433a206e6f7420657869737400000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b7f46433a206d696e742069732070617573652e0000000000000000000000000000600082015250565b7f46433a2066726565206d696e7420636f6d706c6574652e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f46433a20696e76616c69642073746167652e0000000000000000000000000000600082015250565b600281106134c5576134c4613262565b5b50565b6134d18161304c565b81146134dc57600080fd5b50565b6134e88161305e565b81146134f357600080fd5b50565b6134ff8161306a565b811461350a57600080fd5b50565b6002811061351a57600080fd5b50565b613526816130c9565b811461353157600080fd5b5056fea264697066735822122023ab73320c4b47c857c8dcd67d424a12f3d4a22d9fcf336bac48dd99cbbd68e164736f6c63430008070033
Deployed Bytecode Sourcemap
45880:1910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28129:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31242:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32745:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32308:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27378:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33610:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33851:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47047:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47161:231;;;:::i;:::-;;31050:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46039:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28498:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4373:103;;;:::i;:::-;;47524:263;;;:::i;:::-;;3722:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31411:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45951:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33021:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34107:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46000:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46298:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46816:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47400:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33379:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4631:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28129:305;28231:4;28283:25;28268:40;;;:11;:40;;;;:105;;;;28340:33;28325:48;;;:11;:48;;;;28268:105;:158;;;;28390:36;28414:11;28390:23;:36::i;:::-;28268:158;28248:178;;28129:305;;;:::o;31242:100::-;31296:13;31329:5;31322:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31242:100;:::o;32745:204::-;32813:7;32838:16;32846:7;32838;:16::i;:::-;32833:64;;32863:34;;;;;;;;;;;;;;32833:64;32917:15;:24;32933:7;32917:24;;;;;;;;;;;;;;;;;;;;;32910:31;;32745:204;;;:::o;32308:371::-;32381:13;32397:24;32413:7;32397:15;:24::i;:::-;32381:40;;32442:5;32436:11;;:2;:11;;;32432:48;;;32456:24;;;;;;;;;;;;;;32432:48;32513:5;32497:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32523:37;32540:5;32547:12;:10;:12::i;:::-;32523:16;:37::i;:::-;32522:38;32497:63;32493:138;;;32584:35;;;;;;;;;;;;;;32493:138;32643:28;32652:2;32656:7;32665:5;32643:8;:28::i;:::-;32370:309;32308:371;;:::o;27378:303::-;27422:7;27647:15;:13;:15::i;:::-;27632:12;;27616:13;;:28;:46;27609:53;;27378:303;:::o;33610:170::-;33744:28;33754:4;33760:2;33764:7;33744:9;:28::i;:::-;33610:170;;;:::o;33851:185::-;33989:39;34006:4;34012:2;34016:7;33989:39;;;;;;;;;;;;:16;:39::i;:::-;33851:185;;;:::o;47047:106::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47134:11:::1;47124:7;:21;;;;;;;;;;;;:::i;:::-;;47047:106:::0;:::o;47161:231::-;47218:11;47209:20;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:20;;;;;;;;:::i;:::-;;;47201:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;45989:4;47271:10;;:24;47263:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47348:1;47334:10;;:15;;;;;;;:::i;:::-;;;;;;;;47360:24;47370:10;47382:1;47360:9;:24::i;:::-;47161:231::o;31050:125::-;31114:7;31141:21;31154:7;31141:12;:21::i;:::-;:26;;;31134:33;;31050:125;;;:::o;46039:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28498:206::-;28562:7;28603:1;28586:19;;:5;:19;;;28582:60;;;28614:28;;;;;;;;;;;;;;28582:60;28668:12;:19;28681:5;28668:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28660:36;;28653:43;;28498:206;;;:::o;4373:103::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:30:::1;4465:1;4438:18;:30::i;:::-;4373:103::o:0;47524:263::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47577:15:::1;47595:21;47577:39;;47645:1;47635:7;:11;47627:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;47671:12;47697:10;47689:24;;47721:7;47689:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47670:63;;;47752:7;47744:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;47566:221;;47524:263::o:0;3722:87::-;3768:7;3795:6;;;;;;;;;;;3788:13;;3722:87;:::o;31411:104::-;31467:13;31500:7;31493:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31411:104;:::o;45951:42::-;45989:4;45951:42;:::o;33021:287::-;33132:12;:10;:12::i;:::-;33120:24;;:8;:24;;;33116:54;;;33153:17;;;;;;;;;;;;;;33116:54;33228:8;33183:18;:32;33202:12;:10;:12::i;:::-;33183:32;;;;;;;;;;;;;;;:42;33216:8;33183:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33281:8;33252:48;;33267:12;:10;:12::i;:::-;33252:48;;;33291:8;33252:48;;;;;;:::i;:::-;;;;;;;;33021:287;;:::o;34107:369::-;34274:28;34284:4;34290:2;34294:7;34274:9;:28::i;:::-;34317:15;:2;:13;;;:15::i;:::-;:76;;;;;34337:56;34368:4;34374:2;34378:7;34387:5;34337:30;:56::i;:::-;34336:57;34317:76;34313:156;;;34417:40;;;;;;;;;;;;;;34313:156;34107:369;;;;:::o;46000:32::-;;;;;;;;;;;;;:::o;46298:394::-;46371:13;46405:16;46413:7;46405;:16::i;:::-;46397:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46450:28;46481:10;:8;:10::i;:::-;46450:41;;46555:1;46530:14;46524:28;:32;:149;;;;;;;;;;;;;;;;;46600:14;46616:18;:7;:16;:18::i;:::-;46636:13;46583:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46524:149;46502:182;;;46298:394;;;:::o;46816:221::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46895:6:::1;46886:15;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:15;;;;;;;;:::i;:::-;;;;46878:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;46935:15;46953:5;;;;;;;;;;;46935:23;;46977:6;46969:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;46999:30;47012:9;47023:5;;;;;;;;;;;46999:30;;;;;;;:::i;:::-;;;;;;;;46867:170;46816:221:::0;:::o;47400:116::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47498:10:::1;47482:13;:26;;;;;;;;;;;;:::i;:::-;;47400:116:::0;:::o;33379:164::-;33476:4;33500:18;:25;33519:5;33500:25;;;;;;;;;;;;;;;:35;33526:8;33500:35;;;;;;;;;;;;;;;;;;;;;;;;;33493:42;;33379:164;;;;:::o;4631:201::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4740:1:::1;4720:22;;:8;:22;;;;4712:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4796:28;4815:8;4796:18;:28::i;:::-;4631:201:::0;:::o;23792:157::-;23877:4;23916:25;23901:40;;;:11;:40;;;;23894:47;;23792:157;;;:::o;34731:174::-;34788:4;34831:7;34812:15;:13;:15::i;:::-;:26;;:53;;;;;34852:13;;34842:7;:23;34812:53;:85;;;;;34870:11;:20;34882:7;34870:20;;;;;;;;;;;:27;;;;;;;;;;;;34869:28;34812:85;34805:92;;34731:174;;;:::o;2587:98::-;2640:7;2667:10;2660:17;;2587:98;:::o;42888:196::-;43030:2;43003:15;:24;43019:7;43003:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43068:7;43064:2;43048:28;;43057:5;43048:28;;;;;;;;;;;;42888:196;;;:::o;27152:92::-;27208:7;27152:92;:::o;37831:2130::-;37946:35;37984:21;37997:7;37984:12;:21::i;:::-;37946:59;;38044:4;38022:26;;:13;:18;;;:26;;;38018:67;;38057:28;;;;;;;;;;;;;;38018:67;38098:22;38140:4;38124:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;38161:36;38178:4;38184:12;:10;:12::i;:::-;38161:16;:36::i;:::-;38124:73;:126;;;;38238:12;:10;:12::i;:::-;38214:36;;:20;38226:7;38214:11;:20::i;:::-;:36;;;38124:126;38098:153;;38269:17;38264:66;;38295:35;;;;;;;;;;;;;;38264:66;38359:1;38345:16;;:2;:16;;;38341:52;;;38370:23;;;;;;;;;;;;;;38341:52;38406:43;38428:4;38434:2;38438:7;38447:1;38406:21;:43::i;:::-;38514:35;38531:1;38535:7;38544:4;38514:8;:35::i;:::-;38875:1;38845:12;:18;38858:4;38845:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38919:1;38891:12;:16;38904:2;38891:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:31;38971:11;:20;38983:7;38971:20;;;;;;;;;;;38937:54;;39022:2;39006:8;:13;;;:18;;;;;;;;;;;;;;;;;;39072:15;39039:8;:23;;;:49;;;;;;;;;;;;;;;;;;39340:19;39372:1;39362:7;:11;39340:33;;39388:31;39422:11;:24;39434:11;39422:24;;;;;;;;;;;39388:58;;39490:1;39465:27;;:8;:13;;;;;;;;;;;;:27;;;39461:384;;;39675:13;;39660:11;:28;39656:174;;39729:4;39713:8;:13;;;:20;;;;;;;;;;;;;;;;;;39782:13;:28;;;39756:8;:23;;;:54;;;;;;;;;;;;;;;;;;39656:174;39461:384;38820:1036;;;39892:7;39888:2;39873:27;;39882:4;39873:27;;;;;;;;;;;;39911:42;39932:4;39938:2;39942:7;39951:1;39911:20;:42::i;:::-;37935:2026;;37831:2130;;;:::o;34913:104::-;34982:27;34992:2;34996:8;34982:27;;;;;;;;;;;;:9;:27::i;:::-;34913:104;;:::o;29879:1109::-;29941:21;;:::i;:::-;29975:12;29990:7;29975:22;;30058:4;30039:15;:13;:15::i;:::-;:23;;:47;;;;;30073:13;;30066:4;:20;30039:47;30035:886;;;30107:31;30141:11;:17;30153:4;30141:17;;;;;;;;;;;30107:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30182:9;:16;;;30177:729;;30253:1;30227:28;;:9;:14;;;:28;;;30223:101;;30291:9;30284:16;;;;;;30223:101;30626:261;30633:4;30626:261;;;30666:6;;;;;;;;30711:11;:17;30723:4;30711:17;;;;;;;;;;;30699:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30785:1;30759:28;;:9;:14;;;:28;;;30755:109;;30827:9;30820:16;;;;;;30755:109;30626:261;;;30177:729;30088:833;30035:886;30949:31;;;;;;;;;;;;;;29879:1109;;;;:::o;4992:191::-;5066:16;5085:6;;;;;;;;;;;5066:25;;5111:8;5102:6;;:17;;;;;;;;;;;;;;;;;;5166:8;5135:40;;5156:8;5135:40;;;;;;;;;;;;5055:128;4992:191;:::o;15820:326::-;15880:4;16137:1;16115:7;:19;;;:23;16108:30;;15820:326;;;:::o;43576:667::-;43739:4;43776:2;43760:36;;;43797:12;:10;:12::i;:::-;43811:4;43817:7;43826:5;43760:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43756:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44011:1;43994:6;:13;:18;43990:235;;;44040:40;;;;;;;;;;;;;;43990:235;44183:6;44177:13;44168:6;44164:2;44160:15;44153:38;43756:480;43889:45;;;43879:55;;;:6;:55;;;;43872:62;;;43576:667;;;;;;:::o;46700:108::-;46760:13;46793:7;46786:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46700:108;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;44891:159::-;;;;;:::o;45709:158::-;;;;;:::o;35380:163::-;35503:32;35509:2;35513:8;35523:5;35530:4;35503:5;:32::i;:::-;35380:163;;;:::o;35802:1775::-;35941:20;35964:13;;35941:36;;36006:1;35992:16;;:2;:16;;;35988:48;;;36017:19;;;;;;;;;;;;;;35988:48;36063:1;36051:8;:13;36047:44;;;36073:18;;;;;;;;;;;;;;36047:44;36104:61;36134:1;36138:2;36142:12;36156:8;36104:21;:61::i;:::-;36477:8;36442:12;:16;36455:2;36442:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36541:8;36501:12;:16;36514:2;36501:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36600:2;36567:11;:25;36579:12;36567:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36667:15;36617:11;:25;36629:12;36617:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36700:20;36723:12;36700:35;;36750:11;36779:8;36764:12;:23;36750:37;;36808:4;:23;;;;;36816:15;:2;:13;;;:15::i;:::-;36808:23;36804:641;;;36852:314;36908:12;36904:2;36883:38;;36900:1;36883:38;;;;;;;;;;;;36949:69;36988:1;36992:2;36996:14;;;;;;37012:5;36949:30;:69::i;:::-;36944:174;;37054:40;;;;;;;;;;;;;;36944:174;37161:3;37145:12;:19;;36852:314;;37247:12;37230:13;;:29;37226:43;;37261:8;;;37226:43;36804:641;;;37310:120;37366:14;;;;;;37362:2;37341:40;;37358:1;37341:40;;;;;;;;;;;;37425:3;37409:12;:19;;37310:120;;36804:641;37475:12;37459:13;:28;;;;36417:1082;;37509:60;37538:1;37542:2;37546:12;37560:8;37509:20;:60::i;:::-;35930:1647;35802:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1772:159::-;1828:5;1866:6;1853:20;1844:29;;1882:43;1919:5;1882:43;:::i;:::-;1772:159;;;;:::o;1951:340::-;2007:5;2056:3;2049:4;2041:6;2037:17;2033:27;2023:122;;2064:79;;:::i;:::-;2023:122;2181:6;2168:20;2206:79;2281:3;2273:6;2266:4;2258:6;2254:17;2206:79;:::i;:::-;2197:88;;2013:278;1951:340;;;;:::o;2297:139::-;2343:5;2381:6;2368:20;2359:29;;2397:33;2424:5;2397:33;:::i;:::-;2297:139;;;;:::o;2442:329::-;2501:6;2550:2;2538:9;2529:7;2525:23;2521:32;2518:119;;;2556:79;;:::i;:::-;2518:119;2676:1;2701:53;2746:7;2737:6;2726:9;2722:22;2701:53;:::i;:::-;2691:63;;2647:117;2442:329;;;;:::o;2777:474::-;2845:6;2853;2902:2;2890:9;2881:7;2877:23;2873:32;2870:119;;;2908:79;;:::i;:::-;2870:119;3028:1;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2999:117;3155:2;3181:53;3226:7;3217:6;3206:9;3202:22;3181:53;:::i;:::-;3171:63;;3126:118;2777:474;;;;;:::o;3257:619::-;3334:6;3342;3350;3399:2;3387:9;3378:7;3374:23;3370:32;3367:119;;;3405:79;;:::i;:::-;3367:119;3525:1;3550:53;3595:7;3586:6;3575:9;3571:22;3550:53;:::i;:::-;3540:63;;3496:117;3652:2;3678:53;3723:7;3714:6;3703:9;3699:22;3678:53;:::i;:::-;3668:63;;3623:118;3780:2;3806:53;3851:7;3842:6;3831:9;3827:22;3806:53;:::i;:::-;3796:63;;3751:118;3257:619;;;;;:::o;3882:943::-;3977:6;3985;3993;4001;4050:3;4038:9;4029:7;4025:23;4021:33;4018:120;;;4057:79;;:::i;:::-;4018:120;4177:1;4202:53;4247:7;4238:6;4227:9;4223:22;4202:53;:::i;:::-;4192:63;;4148:117;4304:2;4330:53;4375:7;4366:6;4355:9;4351:22;4330:53;:::i;:::-;4320:63;;4275:118;4432:2;4458:53;4503:7;4494:6;4483:9;4479:22;4458:53;:::i;:::-;4448:63;;4403:118;4588:2;4577:9;4573:18;4560:32;4619:18;4611:6;4608:30;4605:117;;;4641:79;;:::i;:::-;4605:117;4746:62;4800:7;4791:6;4780:9;4776:22;4746:62;:::i;:::-;4736:72;;4531:287;3882:943;;;;;;;:::o;4831:468::-;4896:6;4904;4953:2;4941:9;4932:7;4928:23;4924:32;4921:119;;;4959:79;;:::i;:::-;4921:119;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;5206:2;5232:50;5274:7;5265:6;5254:9;5250:22;5232:50;:::i;:::-;5222:60;;5177:115;4831:468;;;;;:::o;5305:474::-;5373:6;5381;5430:2;5418:9;5409:7;5405:23;5401:32;5398:119;;;5436:79;;:::i;:::-;5398:119;5556:1;5581:53;5626:7;5617:6;5606:9;5602:22;5581:53;:::i;:::-;5571:63;;5527:117;5683:2;5709:53;5754:7;5745:6;5734:9;5730:22;5709:53;:::i;:::-;5699:63;;5654:118;5305:474;;;;;:::o;5785:327::-;5843:6;5892:2;5880:9;5871:7;5867:23;5863:32;5860:119;;;5898:79;;:::i;:::-;5860:119;6018:1;6043:52;6087:7;6078:6;6067:9;6063:22;6043:52;:::i;:::-;6033:62;;5989:116;5785:327;;;;:::o;6118:349::-;6187:6;6236:2;6224:9;6215:7;6211:23;6207:32;6204:119;;;6242:79;;:::i;:::-;6204:119;6362:1;6387:63;6442:7;6433:6;6422:9;6418:22;6387:63;:::i;:::-;6377:73;;6333:127;6118:349;;;;:::o;6473:::-;6542:6;6591:2;6579:9;6570:7;6566:23;6562:32;6559:119;;;6597:79;;:::i;:::-;6559:119;6717:1;6742:63;6797:7;6788:6;6777:9;6773:22;6742:63;:::i;:::-;6732:73;;6688:127;6473:349;;;;:::o;6828:509::-;6897:6;6946:2;6934:9;6925:7;6921:23;6917:32;6914:119;;;6952:79;;:::i;:::-;6914:119;7100:1;7089:9;7085:17;7072:31;7130:18;7122:6;7119:30;7116:117;;;7152:79;;:::i;:::-;7116:117;7257:63;7312:7;7303:6;7292:9;7288:22;7257:63;:::i;:::-;7247:73;;7043:287;6828:509;;;;:::o;7343:329::-;7402:6;7451:2;7439:9;7430:7;7426:23;7422:32;7419:119;;;7457:79;;:::i;:::-;7419:119;7577:1;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7548:117;7343:329;;;;:::o;7678:118::-;7765:24;7783:5;7765:24;:::i;:::-;7760:3;7753:37;7678:118;;:::o;7802:109::-;7883:21;7898:5;7883:21;:::i;:::-;7878:3;7871:34;7802:109;;:::o;7917:360::-;8003:3;8031:38;8063:5;8031:38;:::i;:::-;8085:70;8148:6;8143:3;8085:70;:::i;:::-;8078:77;;8164:52;8209:6;8204:3;8197:4;8190:5;8186:16;8164:52;:::i;:::-;8241:29;8263:6;8241:29;:::i;:::-;8236:3;8232:39;8225:46;;8007:270;7917:360;;;;:::o;8283:147::-;8378:45;8417:5;8378:45;:::i;:::-;8373:3;8366:58;8283:147;;:::o;8436:364::-;8524:3;8552:39;8585:5;8552:39;:::i;:::-;8607:71;8671:6;8666:3;8607:71;:::i;:::-;8600:78;;8687:52;8732:6;8727:3;8720:4;8713:5;8709:16;8687:52;:::i;:::-;8764:29;8786:6;8764:29;:::i;:::-;8759:3;8755:39;8748:46;;8528:272;8436:364;;;;:::o;8806:377::-;8912:3;8940:39;8973:5;8940:39;:::i;:::-;8995:89;9077:6;9072:3;8995:89;:::i;:::-;8988:96;;9093:52;9138:6;9133:3;9126:4;9119:5;9115:16;9093:52;:::i;:::-;9170:6;9165:3;9161:16;9154:23;;8916:267;8806:377;;;;:::o;9213:845::-;9316:3;9353:5;9347:12;9382:36;9408:9;9382:36;:::i;:::-;9434:89;9516:6;9511:3;9434:89;:::i;:::-;9427:96;;9554:1;9543:9;9539:17;9570:1;9565:137;;;;9716:1;9711:341;;;;9532:520;;9565:137;9649:4;9645:9;9634;9630:25;9625:3;9618:38;9685:6;9680:3;9676:16;9669:23;;9565:137;;9711:341;9778:38;9810:5;9778:38;:::i;:::-;9838:1;9852:154;9866:6;9863:1;9860:13;9852:154;;;9940:7;9934:14;9930:1;9925:3;9921:11;9914:35;9990:1;9981:7;9977:15;9966:26;;9888:4;9885:1;9881:12;9876:17;;9852:154;;;10035:6;10030:3;10026:16;10019:23;;9718:334;;9532:520;;9320:738;;9213:845;;;;:::o;10064:366::-;10206:3;10227:67;10291:2;10286:3;10227:67;:::i;:::-;10220:74;;10303:93;10392:3;10303:93;:::i;:::-;10421:2;10416:3;10412:12;10405:19;;10064:366;;;:::o;10436:::-;10578:3;10599:67;10663:2;10658:3;10599:67;:::i;:::-;10592:74;;10675:93;10764:3;10675:93;:::i;:::-;10793:2;10788:3;10784:12;10777:19;;10436:366;;;:::o;10808:::-;10950:3;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11047:93;11136:3;11047:93;:::i;:::-;11165:2;11160:3;11156:12;11149:19;;10808:366;;;:::o;11180:365::-;11322:3;11343:66;11407:1;11402:3;11343:66;:::i;:::-;11336:73;;11418:93;11507:3;11418:93;:::i;:::-;11536:2;11531:3;11527:12;11520:19;;11180:365;;;:::o;11551:366::-;11693:3;11714:67;11778:2;11773:3;11714:67;:::i;:::-;11707:74;;11790:93;11879:3;11790:93;:::i;:::-;11908:2;11903:3;11899:12;11892:19;;11551:366;;;:::o;11923:::-;12065:3;12086:67;12150:2;12145:3;12086:67;:::i;:::-;12079:74;;12162:93;12251:3;12162:93;:::i;:::-;12280:2;12275:3;12271:12;12264:19;;11923:366;;;:::o;12295:::-;12437:3;12458:67;12522:2;12517:3;12458:67;:::i;:::-;12451:74;;12534:93;12623:3;12534:93;:::i;:::-;12652:2;12647:3;12643:12;12636:19;;12295:366;;;:::o;12667:398::-;12826:3;12847:83;12928:1;12923:3;12847:83;:::i;:::-;12840:90;;12939:93;13028:3;12939:93;:::i;:::-;13057:1;13052:3;13048:11;13041:18;;12667:398;;;:::o;13071:366::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:118::-;13530:24;13548:5;13530:24;:::i;:::-;13525:3;13518:37;13443:118;;:::o;13567:589::-;13792:3;13814:95;13905:3;13896:6;13814:95;:::i;:::-;13807:102;;13926:95;14017:3;14008:6;13926:95;:::i;:::-;13919:102;;14038:92;14126:3;14117:6;14038:92;:::i;:::-;14031:99;;14147:3;14140:10;;13567:589;;;;;;:::o;14162:379::-;14346:3;14368:147;14511:3;14368:147;:::i;:::-;14361:154;;14532:3;14525:10;;14162:379;;;:::o;14547:222::-;14640:4;14678:2;14667:9;14663:18;14655:26;;14691:71;14759:1;14748:9;14744:17;14735:6;14691:71;:::i;:::-;14547:222;;;;:::o;14775:640::-;14970:4;15008:3;14997:9;14993:19;14985:27;;15022:71;15090:1;15079:9;15075:17;15066:6;15022:71;:::i;:::-;15103:72;15171:2;15160:9;15156:18;15147:6;15103:72;:::i;:::-;15185;15253:2;15242:9;15238:18;15229:6;15185:72;:::i;:::-;15304:9;15298:4;15294:20;15289:2;15278:9;15274:18;15267:48;15332:76;15403:4;15394:6;15332:76;:::i;:::-;15324:84;;14775:640;;;;;;;:::o;15421:210::-;15508:4;15546:2;15535:9;15531:18;15523:26;;15559:65;15621:1;15610:9;15606:17;15597:6;15559:65;:::i;:::-;15421:210;;;;:::o;15637:238::-;15738:4;15776:2;15765:9;15761:18;15753:26;;15789:79;15865:1;15854:9;15850:17;15841:6;15789:79;:::i;:::-;15637:238;;;;:::o;15881:364::-;16018:4;16056:2;16045:9;16041:18;16033:26;;16069:79;16145:1;16134:9;16130:17;16121:6;16069:79;:::i;:::-;16158:80;16234:2;16223:9;16219:18;16210:6;16158:80;:::i;:::-;15881:364;;;;;:::o;16251:313::-;16364:4;16402:2;16391:9;16387:18;16379:26;;16451:9;16445:4;16441:20;16437:1;16426:9;16422:17;16415:47;16479:78;16552:4;16543:6;16479:78;:::i;:::-;16471:86;;16251:313;;;;:::o;16570:419::-;16736:4;16774:2;16763:9;16759:18;16751:26;;16823:9;16817:4;16813:20;16809:1;16798:9;16794:17;16787:47;16851:131;16977:4;16851:131;:::i;:::-;16843:139;;16570:419;;;:::o;16995:::-;17161:4;17199:2;17188:9;17184:18;17176:26;;17248:9;17242:4;17238:20;17234:1;17223:9;17219:17;17212:47;17276:131;17402:4;17276:131;:::i;:::-;17268:139;;16995:419;;;:::o;17420:::-;17586:4;17624:2;17613:9;17609:18;17601:26;;17673:9;17667:4;17663:20;17659:1;17648:9;17644:17;17637:47;17701:131;17827:4;17701:131;:::i;:::-;17693:139;;17420:419;;;:::o;17845:::-;18011:4;18049:2;18038:9;18034:18;18026:26;;18098:9;18092:4;18088:20;18084:1;18073:9;18069:17;18062:47;18126:131;18252:4;18126:131;:::i;:::-;18118:139;;17845:419;;;:::o;18270:::-;18436:4;18474:2;18463:9;18459:18;18451:26;;18523:9;18517:4;18513:20;18509:1;18498:9;18494:17;18487:47;18551:131;18677:4;18551:131;:::i;:::-;18543:139;;18270:419;;;:::o;18695:::-;18861:4;18899:2;18888:9;18884:18;18876:26;;18948:9;18942:4;18938:20;18934:1;18923:9;18919:17;18912:47;18976:131;19102:4;18976:131;:::i;:::-;18968:139;;18695:419;;;:::o;19120:::-;19286:4;19324:2;19313:9;19309:18;19301:26;;19373:9;19367:4;19363:20;19359:1;19348:9;19344:17;19337:47;19401:131;19527:4;19401:131;:::i;:::-;19393:139;;19120:419;;;:::o;19545:::-;19711:4;19749:2;19738:9;19734:18;19726:26;;19798:9;19792:4;19788:20;19784:1;19773:9;19769:17;19762:47;19826:131;19952:4;19826:131;:::i;:::-;19818:139;;19545:419;;;:::o;19970:222::-;20063:4;20101:2;20090:9;20086:18;20078:26;;20114:71;20182:1;20171:9;20167:17;20158:6;20114:71;:::i;:::-;19970:222;;;;:::o;20198:129::-;20232:6;20259:20;;:::i;:::-;20249:30;;20288:33;20316:4;20308:6;20288:33;:::i;:::-;20198:129;;;:::o;20333:75::-;20366:6;20399:2;20393:9;20383:19;;20333:75;:::o;20414:307::-;20475:4;20565:18;20557:6;20554:30;20551:56;;;20587:18;;:::i;:::-;20551:56;20625:29;20647:6;20625:29;:::i;:::-;20617:37;;20709:4;20703;20699:15;20691:23;;20414:307;;;:::o;20727:308::-;20789:4;20879:18;20871:6;20868:30;20865:56;;;20901:18;;:::i;:::-;20865:56;20939:29;20961:6;20939:29;:::i;:::-;20931:37;;21023:4;21017;21013:15;21005:23;;20727:308;;;:::o;21041:141::-;21090:4;21113:3;21105:11;;21136:3;21133:1;21126:14;21170:4;21167:1;21157:18;21149:26;;21041:141;;;:::o;21188:98::-;21239:6;21273:5;21267:12;21257:22;;21188:98;;;:::o;21292:99::-;21344:6;21378:5;21372:12;21362:22;;21292:99;;;:::o;21397:168::-;21480:11;21514:6;21509:3;21502:19;21554:4;21549:3;21545:14;21530:29;;21397:168;;;;:::o;21571:147::-;21672:11;21709:3;21694:18;;21571:147;;;;:::o;21724:169::-;21808:11;21842:6;21837:3;21830:19;21882:4;21877:3;21873:14;21858:29;;21724:169;;;;:::o;21899:148::-;22001:11;22038:3;22023:18;;21899:148;;;;:::o;22053:305::-;22093:3;22112:20;22130:1;22112:20;:::i;:::-;22107:25;;22146:20;22164:1;22146:20;:::i;:::-;22141:25;;22300:1;22232:66;22228:74;22225:1;22222:81;22219:107;;;22306:18;;:::i;:::-;22219:107;22350:1;22347;22343:9;22336:16;;22053:305;;;;:::o;22364:185::-;22404:1;22421:20;22439:1;22421:20;:::i;:::-;22416:25;;22455:20;22473:1;22455:20;:::i;:::-;22450:25;;22494:1;22484:35;;22499:18;;:::i;:::-;22484:35;22541:1;22538;22534:9;22529:14;;22364:185;;;;:::o;22555:191::-;22595:4;22615:20;22633:1;22615:20;:::i;:::-;22610:25;;22649:20;22667:1;22649:20;:::i;:::-;22644:25;;22688:1;22685;22682:8;22679:34;;;22693:18;;:::i;:::-;22679:34;22738:1;22735;22731:9;22723:17;;22555:191;;;;:::o;22752:96::-;22789:7;22818:24;22836:5;22818:24;:::i;:::-;22807:35;;22752:96;;;:::o;22854:90::-;22888:7;22931:5;22924:13;22917:21;22906:32;;22854:90;;;:::o;22950:149::-;22986:7;23026:66;23019:5;23015:78;23004:89;;22950:149;;;:::o;23105:131::-;23152:7;23181:5;23170:16;;23187:43;23224:5;23187:43;:::i;:::-;23105:131;;;:::o;23242:126::-;23279:7;23319:42;23312:5;23308:54;23297:65;;23242:126;;;:::o;23374:77::-;23411:7;23440:5;23429:16;;23374:77;;;:::o;23457:131::-;23515:9;23548:34;23576:5;23548:34;:::i;:::-;23535:47;;23457:131;;;:::o;23594:154::-;23678:6;23673:3;23668;23655:30;23740:1;23731:6;23726:3;23722:16;23715:27;23594:154;;;:::o;23754:307::-;23822:1;23832:113;23846:6;23843:1;23840:13;23832:113;;;23931:1;23926:3;23922:11;23916:18;23912:1;23907:3;23903:11;23896:39;23868:2;23865:1;23861:10;23856:15;;23832:113;;;23963:6;23960:1;23957:13;23954:101;;;24043:1;24034:6;24029:3;24025:16;24018:27;23954:101;23803:258;23754:307;;;:::o;24067:320::-;24111:6;24148:1;24142:4;24138:12;24128:22;;24195:1;24189:4;24185:12;24216:18;24206:81;;24272:4;24264:6;24260:17;24250:27;;24206:81;24334:2;24326:6;24323:14;24303:18;24300:38;24297:84;;;24353:18;;:::i;:::-;24297:84;24118:269;24067:320;;;:::o;24393:281::-;24476:27;24498:4;24476:27;:::i;:::-;24468:6;24464:40;24606:6;24594:10;24591:22;24570:18;24558:10;24555:34;24552:62;24549:88;;;24617:18;;:::i;:::-;24549:88;24657:10;24653:2;24646:22;24436:238;24393:281;;:::o;24680:233::-;24719:3;24742:24;24760:5;24742:24;:::i;:::-;24733:33;;24788:66;24781:5;24778:77;24775:103;;;24858:18;;:::i;:::-;24775:103;24905:1;24898:5;24894:13;24887:20;;24680:233;;;:::o;24919:176::-;24951:1;24968:20;24986:1;24968:20;:::i;:::-;24963:25;;25002:20;25020:1;25002:20;:::i;:::-;24997:25;;25041:1;25031:35;;25046:18;;:::i;:::-;25031:35;25087:1;25084;25080:9;25075:14;;24919:176;;;;:::o;25101:180::-;25149:77;25146:1;25139:88;25246:4;25243:1;25236:15;25270:4;25267:1;25260:15;25287:180;25335:77;25332:1;25325:88;25432:4;25429:1;25422:15;25456:4;25453:1;25446:15;25473:180;25521:77;25518:1;25511:88;25618:4;25615:1;25608:15;25642:4;25639:1;25632:15;25659:180;25707:77;25704:1;25697:88;25804:4;25801:1;25794:15;25828:4;25825:1;25818:15;25845:180;25893:77;25890:1;25883:88;25990:4;25987:1;25980:15;26014:4;26011:1;26004:15;26031:180;26079:77;26076:1;26069:88;26176:4;26173:1;26166:15;26200:4;26197:1;26190:15;26217:117;26326:1;26323;26316:12;26340:117;26449:1;26446;26439:12;26463:117;26572:1;26569;26562:12;26586:117;26695:1;26692;26685:12;26709:102;26750:6;26801:2;26797:7;26792:2;26785:5;26781:14;26777:28;26767:38;;26709:102;;;:::o;26817:163::-;26957:15;26953:1;26945:6;26941:14;26934:39;26817:163;:::o;26986:225::-;27126:34;27122:1;27114:6;27110:14;27103:58;27195:8;27190:2;27182:6;27178:15;27171:33;26986:225;:::o;27217:165::-;27357:17;27353:1;27345:6;27341:14;27334:41;27217:165;:::o;27388:158::-;27528:10;27524:1;27516:6;27512:14;27505:34;27388:158;:::o;27552:168::-;27692:20;27688:1;27680:6;27676:14;27669:44;27552:168;:::o;27726:173::-;27866:25;27862:1;27854:6;27850:14;27843:49;27726:173;:::o;27905:182::-;28045:34;28041:1;28033:6;28029:14;28022:58;27905:182;:::o;28093:114::-;;:::o;28213:168::-;28353:20;28349:1;28341:6;28337:14;28330:44;28213:168;:::o;28387:115::-;28470:1;28463:5;28460:12;28450:46;;28476:18;;:::i;:::-;28450:46;28387:115;:::o;28508:122::-;28581:24;28599:5;28581:24;:::i;:::-;28574:5;28571:35;28561:63;;28620:1;28617;28610:12;28561:63;28508:122;:::o;28636:116::-;28706:21;28721:5;28706:21;:::i;:::-;28699:5;28696:32;28686:60;;28742:1;28739;28732:12;28686:60;28636:116;:::o;28758:120::-;28830:23;28847:5;28830:23;:::i;:::-;28823:5;28820:34;28810:62;;28868:1;28865;28858:12;28810:62;28758:120;:::o;28884:109::-;28967:1;28960:5;28957:12;28947:40;;28983:1;28980;28973:12;28947:40;28884:109;:::o;28999:122::-;29072:24;29090:5;29072:24;:::i;:::-;29065:5;29062:35;29052:63;;29111:1;29108;29101:12;29052:63;28999:122;:::o
Swarm Source
ipfs://23ab73320c4b47c857c8dcd67d424a12f3d4a22d9fcf336bac48dd99cbbd68e1
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.