Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
669 Pigeons 4
Holders
224
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 Pigeons 4Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Pigeons4
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-02 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //Developer Info: //Written by Blockchainguy.net //Email: [email protected] //Instagram: @sheraz.manzoor /** * @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; } } 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); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); 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 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @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) { if (owner == address(0)) revert MintedQueryForZeroAddress(); 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) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); 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) { if (owner == address(0)) revert AuxQueryForZeroAddress(); 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _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 (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 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 (!_checkOnERC721Received(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 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; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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; _ownerships[tokenId].addr = to; _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, 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 address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @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 {} } library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } contract Pigeons4 is EIP712, Ownable, ERC721A{ error SaleIsPaused(); string private constant SIGNING_DOMAIN = "WEB3CLUB"; string private constant SIGNATURE_VERSION = "1"; uint public maxSupply = 743; string public baseURI = "https://pigeonsphase4api.vercel.app/api/nft/"; bool public salePaused = true; bool public presalePaused = false; bool public crossmintPaused = false; address private whitelistVerify = 0xbF3e689B25F460F695FC5a6715aA9c74de79e52F; mapping(uint => uint) public voucherIds; uint public crossmintPrice = 0.03 ether; uint public salePrice = 0.03 ether; uint public presalePrice = 0.03 ether; uint public presaleSupply = 646; constructor() ERC721A("Pigeons of New York: Phase4", "Pigeons 4") EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){} function sendNftstoMultipleWallets(address[] memory _wallets) external onlyOwner{ require(totalSupply() + _wallets.length < maxSupply, "Max Supply Reached."); for(uint i = 0; i < _wallets.length; i++) _safeMint(_wallets[i], 1); } function sendManyNfts(address _reciever, uint256 _count) external onlyOwner{ require(totalSupply() + _count < maxSupply, "Max Supply Reached."); _safeMint(_reciever, _count); } function cross(address to, uint256 quantity) external payable{ if(crossmintPaused){ revert SaleIsPaused(); } require(totalSupply() + quantity < maxSupply, "Max Supply Reached."); require(msg.value == crossmintPrice * quantity, "Please send correct amount."); require(quantity + totalSupply() < presaleSupply, "Limit Reached."); _safeMint(to, quantity); } function mint(uint256 _quantity) external payable { // Normal requirements require(!salePaused, "Sale is paused!"); require(_quantity > 0, "Minimum 1 NFT has to be minted per transaction"); require(_quantity + totalSupply() < maxSupply, "Sold out"); require(msg.value == salePrice * _quantity, "Please send correct amount."); // Mint _safeMint(msg.sender, _quantity); } function mintPresale(uint256 _quantity, uint256 id, bytes memory signature) external payable { // Normal requirements require(!presalePaused, "Sale is paused!"); require(_quantity > 0, "Minimum 1 NFT has to be minted per transaction"); require(_quantity + totalSupply() < maxSupply, "Sold out"); require(_quantity + totalSupply() < presaleSupply, "Presale Limit Reached."); require(msg.value == presalePrice * _quantity, "Please send correct amount."); require(check(id,signature) == whitelistVerify, "You are not whitelisted."); require(voucherIds[id] == 0, "Invalid Voucher. Try Again."); // Mint _safeMint(msg.sender, _quantity); voucherIds[id] = 1; } function check(uint id, bytes memory signature) public view returns(address){ return _verify(id, signature); } function _verify(uint id, bytes memory signature) internal view returns(address){ bytes32 digest = _hash(id); return ECDSA.recover(digest, signature); } function _hash(uint id) internal view returns(bytes32){ return _hashTypedDataV4(keccak256(abi.encode( keccak256("EIP712Domain(uint id)"), id ))); } function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function setSalePaused(bool temp) external onlyOwner { salePaused = temp; } function setCrossmintPaused(bool temp) external onlyOwner { crossmintPaused = temp; } function setPresalePaused(bool temp) external onlyOwner { presalePaused = temp; } function setSalePrice(uint temp) external onlyOwner { salePrice = temp; } function setPresaleSupply(uint temp) external onlyOwner { presaleSupply = temp; } function setPresalePrice(uint temp) external onlyOwner { presalePrice = temp; } function setCrossMintPrice(uint temp) external onlyOwner { crossmintPrice = temp; } function setWhitelistVerify(address _to) external onlyOwner{ whitelistVerify = _to; } function setMaxSupply(uint _temp) external onlyOwner{ maxSupply = _temp; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function withdraw() external onlyOwner { uint _balance = address(this).balance; payable(msg.sender).transfer(_balance); } }
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":"SaleIsPaused","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"cross","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crossmintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crossmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"sendManyNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendNftstoMultipleWallets","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":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setCrossMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setCrossmintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_temp","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setPresalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"setWhitelistVerify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526102e76009556040518060600160405280602c8152602001620056e0602c9139600a908162000035919062000647565b506001600b5f6101000a81548160ff0219169083151502179055505f600b60016101000a81548160ff0219169083151502179055505f600b60026101000a81548160ff02191690831515021790555073bf3e689b25f460f695fc5a6715aa9c74de79e52f600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550666a94d74f430000600d55666a94d74f430000600e55666a94d74f430000600f556102866010553480156200010c575f80fd5b506040518060400160405280601b81526020017f506967656f6e73206f66204e657720596f726b3a2050686173653400000000008152506040518060400160405280600981526020017f506967656f6e73203400000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f57454233434c55420000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505f828051906020012090505f828051906020012090505f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200024b818484620002e060201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050620002b4620002a86200031b60201b60201c565b6200032260201b60201c565b8160039081620002c5919062000647565b508060049081620002d7919062000647565b505050620007f4565b5f8383834630604051602001620002fc95949392919062000799565b6040516020818303038152906040528051906020012090509392505050565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200045f57607f821691505b6020821081036200047557620004746200041a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049c565b620004e586836200049c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200052f620005296200052384620004fd565b62000506565b620004fd565b9050919050565b5f819050919050565b6200054a836200050f565b62000562620005598262000536565b848454620004a8565b825550505050565b5f90565b620005786200056a565b620005858184846200053f565b505050565b5b81811015620005ac57620005a05f826200056e565b6001810190506200058b565b5050565b601f821115620005fb57620005c5816200047b565b620005d0846200048d565b81016020851015620005e0578190505b620005f8620005ef856200048d565b8301826200058a565b50505b505050565b5f82821c905092915050565b5f6200061d5f198460080262000600565b1980831691505092915050565b5f6200063783836200060c565b9150826002028217905092915050565b6200065282620003e3565b67ffffffffffffffff8111156200066e576200066d620003ed565b5b6200067a825462000447565b62000687828285620005b0565b5f60209050601f831160018114620006bd575f8415620006a8578287015190505b620006b485826200062a565b86555062000723565b601f198416620006cd866200047b565b5f5b82811015620006f657848901518255600182019150602085019450602081019050620006cf565b8683101562000716578489015162000712601f8916826200060c565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b6200073f816200072b565b82525050565b6200075081620004fd565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007818262000756565b9050919050565b620007938162000775565b82525050565b5f60a082019050620007ae5f83018862000734565b620007bd602083018762000734565b620007cc604083018662000734565b620007db606083018562000745565b620007ea608083018462000788565b9695505050505050565b60805160a05160c05160e0516101005161012051614ea46200083c5f395f61355901525f61359b01525f61357a01525f6134af01525f61350501525f61352e0152614ea45ff3fe608060405260043610610265575f3560e01c80638da5cb5b11610143578063bc6cb080116100b5578063e03b41f011610079578063e03b41f0146108ab578063e5233047146108d5578063e57deb39146108f1578063e985e9c51461092d578063f2fde38b14610969578063f51f96dd1461099157610265565b8063bc6cb080146107d9578063bee53534146107f5578063c87b56dd1461081d578063cd594ffa14610859578063d5abeb011461088157610265565b8063a22cb46511610107578063a22cb465146106d1578063a79fdbb4146106f9578063ab34ee4f14610723578063b3a196e91461075f578063b88d4fde14610789578063b96502cb146107b157610265565b80638da5cb5b1461060f57806395d89b4114610639578063994a0ae714610663578063a0712d681461068d578063a0bcfc7f146106a957610265565b806340a72310116101dc5780636c0360eb116101a05780636c0360eb1461051b5780636f8b44b01461054557806370a082311461056d578063715018a6146105a95780638a0c5204146105bf5780638d92becd146105e757610265565b806340a723101461043d57806342842e0e1461046557806344e973781461048d5780635d08c1ae146104b55780636352211e146104df57610265565b806318160ddd1161022e57806318160ddd1461035d5780631919fed71461038757806323b872dd146103af578063318f0789146103d75780633549345e146103ff5780633ccfd60b1461042757610265565b80620e7fa81461026957806301ffc9a71461029357806306fdde03146102cf578063081812fc146102f9578063095ea7b314610335575b5f80fd5b348015610274575f80fd5b5061027d6109bb565b60405161028a91906137e3565b60405180910390f35b34801561029e575f80fd5b506102b960048036038101906102b49190613862565b6109c1565b6040516102c691906138a7565b60405180910390f35b3480156102da575f80fd5b506102e3610aa2565b6040516102f0919061394a565b60405180910390f35b348015610304575f80fd5b5061031f600480360381019061031a9190613994565b610b32565b60405161032c91906139fe565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190613a41565b610baa565b005b348015610368575f80fd5b50610371610cb3565b60405161037e91906137e3565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a89190613994565b610cc0565b005b3480156103ba575f80fd5b506103d560048036038101906103d09190613a7f565b610d46565b005b3480156103e2575f80fd5b506103fd60048036038101906103f89190613af9565b610d56565b005b34801561040a575f80fd5b5061042560048036038101906104209190613994565b610def565b005b348015610432575f80fd5b5061043b610e75565b005b348015610448575f80fd5b50610463600480360381019061045e9190613a41565b610f3c565b005b348015610470575f80fd5b5061048b60048036038101906104869190613a7f565b61101c565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613b24565b61103b565b005b3480156104c0575f80fd5b506104c96110fb565b6040516104d691906138a7565b60405180910390f35b3480156104ea575f80fd5b5061050560048036038101906105009190613994565b61110d565b60405161051291906139fe565b60405180910390f35b348015610526575f80fd5b5061052f611121565b60405161053c919061394a565b60405180910390f35b348015610550575f80fd5b5061056b60048036038101906105669190613994565b6111ad565b005b348015610578575f80fd5b50610593600480360381019061058e9190613b24565b611233565b6040516105a091906137e3565b60405180910390f35b3480156105b4575f80fd5b506105bd6112fd565b005b3480156105ca575f80fd5b506105e560048036038101906105e09190613c8f565b611384565b005b3480156105f2575f80fd5b5061060d60048036038101906106089190613af9565b611498565b005b34801561061a575f80fd5b50610623611530565b60405161063091906139fe565b60405180910390f35b348015610644575f80fd5b5061064d611557565b60405161065a919061394a565b60405180910390f35b34801561066e575f80fd5b506106776115e7565b60405161068491906138a7565b60405180910390f35b6106a760048036038101906106a29190613994565b6115fa565b005b3480156106b4575f80fd5b506106cf60048036038101906106ca9190613d86565b61173d565b005b3480156106dc575f80fd5b506106f760048036038101906106f29190613dcd565b6117cc565b005b348015610704575f80fd5b5061070d61193e565b60405161071a91906138a7565b60405180910390f35b34801561072e575f80fd5b5061074960048036038101906107449190613994565b611951565b60405161075691906137e3565b60405180910390f35b34801561076a575f80fd5b50610773611966565b60405161078091906137e3565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190613ea9565b61196c565b005b3480156107bc575f80fd5b506107d760048036038101906107d29190613994565b6119bf565b005b6107f360048036038101906107ee9190613f29565b611a45565b005b348015610800575f80fd5b5061081b60048036038101906108169190613af9565b611ce4565b005b348015610828575f80fd5b50610843600480360381019061083e9190613994565b611d7d565b604051610850919061394a565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190613994565b611e18565b005b34801561088c575f80fd5b50610895611e9e565b6040516108a291906137e3565b60405180910390f35b3480156108b6575f80fd5b506108bf611ea4565b6040516108cc91906137e3565b60405180910390f35b6108ef60048036038101906108ea9190613a41565b611eaa565b005b3480156108fc575f80fd5b5061091760048036038101906109129190613f95565b611ffa565b60405161092491906139fe565b60405180910390f35b348015610938575f80fd5b50610953600480360381019061094e9190613fef565b61200d565b60405161096091906138a7565b60405180910390f35b348015610974575f80fd5b5061098f600480360381019061098a9190613b24565b61209b565b005b34801561099c575f80fd5b506109a5612191565b6040516109b291906137e3565b60405180910390f35b600f5481565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9b5750610a9a82612197565b5b9050919050565b606060038054610ab19061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061405a565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f610b3c82612200565b610b72576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bb48261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3a612237565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6c5750610c6a81610c65612237565b61200d565b155b15610ca3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cae83838361223e565b505050565b5f60025460015403905090565b610cc8612237565b73ffffffffffffffffffffffffffffffffffffffff16610ce6611530565b73ffffffffffffffffffffffffffffffffffffffff1614610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906140d4565b60405180910390fd5b80600e8190555050565b610d518383836122ed565b505050565b610d5e612237565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611530565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906140d4565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610df7612237565b73ffffffffffffffffffffffffffffffffffffffff16610e15611530565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906140d4565b60405180910390fd5b80600f8190555050565b610e7d612237565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611530565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906140d4565b60405180910390fd5b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610f38573d5f803e3d5ffd5b5050565b610f44612237565b73ffffffffffffffffffffffffffffffffffffffff16610f62611530565b73ffffffffffffffffffffffffffffffffffffffff1614610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906140d4565b60405180910390fd5b60095481610fc4610cb3565b610fce919061411f565b1061100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061419c565b60405180910390fd5b61101882826127b7565b5050565b61103683838360405180602001604052805f81525061196c565b505050565b611043612237565b73ffffffffffffffffffffffffffffffffffffffff16611061611530565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906140d4565b60405180910390fd5b80600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5f9054906101000a900460ff1681565b5f611117826127d4565b5f01519050919050565b600a805461112e9061405a565b80601f016020809104026020016040519081016040528092919081815260200182805461115a9061405a565b80156111a55780601f1061117c576101008083540402835291602001916111a5565b820191905f5260205f20905b81548152906001019060200180831161118857829003601f168201915b505050505081565b6111b5612237565b73ffffffffffffffffffffffffffffffffffffffff166111d3611530565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906140d4565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611299576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611305612237565b73ffffffffffffffffffffffffffffffffffffffff16611323611530565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611370906140d4565b60405180910390fd5b6113825f612a3e565b565b61138c612237565b73ffffffffffffffffffffffffffffffffffffffff166113aa611530565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906140d4565b60405180910390fd5b600954815161140d610cb3565b611417919061411f565b10611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061419c565b60405180910390fd5b5f5b815181101561149457611487828281518110611478576114776141ba565b5b602002602001015160016127b7565b8080600101915050611459565b5050565b6114a0612237565b73ffffffffffffffffffffffffffffffffffffffff166114be611530565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906140d4565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115669061405a565b80601f01602080910402602001604051908101604052809291908181526020018280546115929061405a565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b5050505050905090565b600b60029054906101000a900460ff1681565b600b5f9054906101000a900460ff1615611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614231565b60405180910390fd5b5f811161168b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611682906142bf565b60405180910390fd5b600954611696610cb3565b826116a1919061411f565b106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614327565b60405180910390fd5b80600e546116ef9190614345565b3414611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906143d0565b60405180910390fd5b61173a33826127b7565b50565b611745612237565b73ffffffffffffffffffffffffffffffffffffffff16611763611530565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0906140d4565b60405180910390fd5b80600a90816117c8919061458b565b5050565b6117d4612237565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611838576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f611844612237565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ed612237565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193291906138a7565b60405180910390a35050565b600b60019054906101000a900460ff1681565b600c602052805f5260405f205f915090505481565b60105481565b6119778484846122ed565b61198384848484612aff565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119c7612237565b73ffffffffffffffffffffffffffffffffffffffff166119e5611530565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a32906140d4565b60405180910390fd5b8060108190555050565b600b60019054906101000a900460ff1615611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614231565b60405180910390fd5b5f8311611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142bf565b60405180910390fd5b600954611ae2610cb3565b84611aed919061411f565b10611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614327565b60405180910390fd5b601054611b38610cb3565b84611b43919061411f565b10611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906146a4565b60405180910390fd5b82600f54611b919190614345565b3414611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906143d0565b60405180910390fd5b600b60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c158383611ffa565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061470c565b60405180910390fd5b5f600c5f8481526020019081526020015f205414611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614774565b60405180910390fd5b611cc833846127b7565b6001600c5f8481526020019081526020015f2081905550505050565b611cec612237565b73ffffffffffffffffffffffffffffffffffffffff16611d0a611530565b73ffffffffffffffffffffffffffffffffffffffff1614611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140d4565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6060611d8882612200565b611dbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611dc7612c78565b90505f815103611de55760405180602001604052805f815250611e10565b80611def84612d08565b604051602001611e009291906147cc565b6040516020818303038152906040525b915050919050565b611e20612237565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611530565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b906140d4565b60405180910390fd5b80600d8190555050565b60095481565b600d5481565b600b60029054906101000a900460ff1615611ef1576040517f71cc92d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095481611efd610cb3565b611f07919061411f565b10611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e9061419c565b60405180910390fd5b80600d54611f559190614345565b3414611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d906143d0565b60405180910390fd5b601054611fa1610cb3565b82611fac919061411f565b10611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614839565b60405180910390fd5b611ff682826127b7565b5050565b5f6120058383612e61565b905092915050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6120a3612237565b73ffffffffffffffffffffffffffffffffffffffff166120c1611530565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e906140d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c906148c7565b60405180910390fd5b61218e81612a3e565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015482108015612230575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6122f7826127d4565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff1661231c612237565b73ffffffffffffffffffffffffffffffffffffffff16148061234e575061234d825f0151612348612237565b61200d565b5b80612393575061235c612237565b73ffffffffffffffffffffffffffffffffffffffff1661237b84610b32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614612434576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612499576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a68585856001612e81565b6124b45f84845f015161223e565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036127475760015481101561274657825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b08585856001612e87565b5050505050565b6127d0828260405180602001604052805f815250612e8d565b5050565b6127dc61378b565b5f829050600154811015612a07575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612a05575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146128f1578092505050612a39565b5b600115612a045781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146129ff578092505050612a39565b6128f2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f612b1f8473ffffffffffffffffffffffffffffffffffffffff16612e9f565b15612c6b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b48612237565b8786866040518563ffffffff1660e01b8152600401612b6a9493929190614937565b6020604051808303815f875af1925050508015612ba557506040513d601f19601f82011682018060405250810190612ba29190614995565b60015b612c1b573d805f8114612bd3576040519150601f19603f3d011682016040523d82523d5f602084013e612bd8565b606091505b505f815103612c13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c70565b600190505b949350505050565b6060600a8054612c879061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb39061405a565b8015612cfe5780601f10612cd557610100808354040283529160200191612cfe565b820191905f5260205f20905b815481529060010190602001808311612ce157829003601f168201915b5050505050905090565b60605f8203612d4e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5c565b5f8290505f5b5f8214612d7d578080612d66906149c0565b915050600a82612d769190614a34565b9150612d54565b5f8167ffffffffffffffff811115612d9857612d97613b53565b5b6040519080825280601f01601f191660200182016040528015612dca5781602001600182028036833780820191505090505b5090505b5f8514612e5557600182612de29190614a64565b9150600a85612df19190614a97565b6030612dfd919061411f565b60f81b818381518110612e1357612e126141ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612e4e9190614a34565b9450612dce565b8093505050505b919050565b5f80612e6c84612eb0565b9050612e788184612f09565b91505092915050565b50505050565b50505050565b612e9a8383836001612f2e565b505050565b5f80823b90505f8111915050919050565b5f612f027f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001612ee7929190614adf565b6040516020818303038152906040528051906020012061324d565b9050919050565b5f805f612f168585613266565b91509150612f23816132e1565b819250505092915050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612fd2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fde5f868387612e81565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561323157818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131e557506131e35f888488612aff565b155b1561321c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061316c565b5080600181905550506132465f868387612e87565b5050505050565b5f61325f6132596134ac565b836135c5565b9050919050565b5f8060418351036132a3575f805f602086015192506040860151915060608601515f1a9050613297878285856135f7565b945094505050506132da565b60408351036132d2575f8060208501519150604085015190506132c78683836136f8565b9350935050506132da565b5f6002915091505b9250929050565b5f60048111156132f4576132f3614b06565b5b81600481111561330757613306614b06565b5b03156134a9576001600481111561332157613320614b06565b5b81600481111561333457613333614b06565b5b03613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b90614b7d565b60405180910390fd5b6002600481111561338857613387614b06565b5b81600481111561339b5761339a614b06565b5b036133db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d290614be5565b60405180910390fd5b600360048111156133ef576133ee614b06565b5b81600481111561340257613401614b06565b5b03613442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343990614c73565b60405180910390fd5b60048081111561345557613454614b06565b5b81600481111561346857613467614b06565b5b036134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614d01565b60405180910390fd5b5b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561352757507f000000000000000000000000000000000000000000000000000000000000000046145b15613554577f000000000000000000000000000000000000000000000000000000000000000090506135c2565b6135bf7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613752565b90505b90565b5f82826040516020016135d9929190614d89565b60405160208183030381529060405280519060200120905092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c111561362f575f6003915091506136ef565b601b8560ff16141580156136475750601c8560ff1614155b15613658575f6004915091506136ef565b5f6001878787876040515f815260200160405260405161367b9493929190614dda565b6020604051602081039080840390855afa15801561369b573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136e7575f600192509250506136ef565b805f92509250505b94509492505050565b5f805f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b841690505f601b60ff865f1c901c613736919061411f565b9050613744878288856135f7565b935093505050935093915050565b5f838383463060405160200161376c959493929190614e1d565b6040516020818303038152906040528051906020012090509392505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f819050919050565b6137dd816137cb565b82525050565b5f6020820190506137f65f8301846137d4565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138418161380d565b811461384b575f80fd5b50565b5f8135905061385c81613838565b92915050565b5f6020828403121561387757613876613805565b5b5f6138848482850161384e565b91505092915050565b5f8115159050919050565b6138a18161388d565b82525050565b5f6020820190506138ba5f830184613898565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156138f75780820151818401526020810190506138dc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61391c826138c0565b61392681856138ca565b93506139368185602086016138da565b61393f81613902565b840191505092915050565b5f6020820190508181035f8301526139628184613912565b905092915050565b613973816137cb565b811461397d575f80fd5b50565b5f8135905061398e8161396a565b92915050565b5f602082840312156139a9576139a8613805565b5b5f6139b684828501613980565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139e8826139bf565b9050919050565b6139f8816139de565b82525050565b5f602082019050613a115f8301846139ef565b92915050565b613a20816139de565b8114613a2a575f80fd5b50565b5f81359050613a3b81613a17565b92915050565b5f8060408385031215613a5757613a56613805565b5b5f613a6485828601613a2d565b9250506020613a7585828601613980565b9150509250929050565b5f805f60608486031215613a9657613a95613805565b5b5f613aa386828701613a2d565b9350506020613ab486828701613a2d565b9250506040613ac586828701613980565b9150509250925092565b613ad88161388d565b8114613ae2575f80fd5b50565b5f81359050613af381613acf565b92915050565b5f60208284031215613b0e57613b0d613805565b5b5f613b1b84828501613ae5565b91505092915050565b5f60208284031215613b3957613b38613805565b5b5f613b4684828501613a2d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b8982613902565b810181811067ffffffffffffffff82111715613ba857613ba7613b53565b5b80604052505050565b5f613bba6137fc565b9050613bc68282613b80565b919050565b5f67ffffffffffffffff821115613be557613be4613b53565b5b602082029050602081019050919050565b5f80fd5b5f613c0c613c0784613bcb565b613bb1565b90508083825260208201905060208402830185811115613c2f57613c2e613bf6565b5b835b81811015613c585780613c448882613a2d565b845260208401935050602081019050613c31565b5050509392505050565b5f82601f830112613c7657613c75613b4f565b5b8135613c86848260208601613bfa565b91505092915050565b5f60208284031215613ca457613ca3613805565b5b5f82013567ffffffffffffffff811115613cc157613cc0613809565b5b613ccd84828501613c62565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115613cf457613cf3613b53565b5b613cfd82613902565b9050602081019050919050565b828183375f83830152505050565b5f613d2a613d2584613cda565b613bb1565b905082815260208101848484011115613d4657613d45613cd6565b5b613d51848285613d0a565b509392505050565b5f82601f830112613d6d57613d6c613b4f565b5b8135613d7d848260208601613d18565b91505092915050565b5f60208284031215613d9b57613d9a613805565b5b5f82013567ffffffffffffffff811115613db857613db7613809565b5b613dc484828501613d59565b91505092915050565b5f8060408385031215613de357613de2613805565b5b5f613df085828601613a2d565b9250506020613e0185828601613ae5565b9150509250929050565b5f67ffffffffffffffff821115613e2557613e24613b53565b5b613e2e82613902565b9050602081019050919050565b5f613e4d613e4884613e0b565b613bb1565b905082815260208101848484011115613e6957613e68613cd6565b5b613e74848285613d0a565b509392505050565b5f82601f830112613e9057613e8f613b4f565b5b8135613ea0848260208601613e3b565b91505092915050565b5f805f8060808587031215613ec157613ec0613805565b5b5f613ece87828801613a2d565b9450506020613edf87828801613a2d565b9350506040613ef087828801613980565b925050606085013567ffffffffffffffff811115613f1157613f10613809565b5b613f1d87828801613e7c565b91505092959194509250565b5f805f60608486031215613f4057613f3f613805565b5b5f613f4d86828701613980565b9350506020613f5e86828701613980565b925050604084013567ffffffffffffffff811115613f7f57613f7e613809565b5b613f8b86828701613e7c565b9150509250925092565b5f8060408385031215613fab57613faa613805565b5b5f613fb885828601613980565b925050602083013567ffffffffffffffff811115613fd957613fd8613809565b5b613fe585828601613e7c565b9150509250929050565b5f806040838503121561400557614004613805565b5b5f61401285828601613a2d565b925050602061402385828601613a2d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061407157607f821691505b6020821081036140845761408361402d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6140be6020836138ca565b91506140c98261408a565b602082019050919050565b5f6020820190508181035f8301526140eb816140b2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614129826137cb565b9150614134836137cb565b925082820190508082111561414c5761414b6140f2565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f6141866013836138ca565b915061419182614152565b602082019050919050565b5f6020820190508181035f8301526141b38161417a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f61421b600f836138ca565b9150614226826141e7565b602082019050919050565b5f6020820190508181035f8301526142488161420f565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f6142a9602e836138ca565b91506142b48261424f565b604082019050919050565b5f6020820190508181035f8301526142d68161429d565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6143116008836138ca565b915061431c826142dd565b602082019050919050565b5f6020820190508181035f83015261433e81614305565b9050919050565b5f61434f826137cb565b915061435a836137cb565b9250828202614368816137cb565b9150828204841483151761437f5761437e6140f2565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f6143ba601b836138ca565b91506143c582614386565b602082019050919050565b5f6020820190508181035f8301526143e7816143ae565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261444a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261440f565b614454868361440f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61448f61448a614485846137cb565b61446c565b6137cb565b9050919050565b5f819050919050565b6144a883614475565b6144bc6144b482614496565b84845461441b565b825550505050565b5f90565b6144d06144c4565b6144db81848461449f565b505050565b5b818110156144fe576144f35f826144c8565b6001810190506144e1565b5050565b601f82111561454357614514816143ee565b61451d84614400565b8101602085101561452c578190505b61454061453885614400565b8301826144e0565b50505b505050565b5f82821c905092915050565b5f6145635f1984600802614548565b1980831691505092915050565b5f61457b8383614554565b9150826002028217905092915050565b614594826138c0565b67ffffffffffffffff8111156145ad576145ac613b53565b5b6145b7825461405a565b6145c2828285614502565b5f60209050601f8311600181146145f3575f84156145e1578287015190505b6145eb8582614570565b865550614652565b601f198416614601866143ee565b5f5b8281101561462857848901518255600182019150602085019450602081019050614603565b868310156146455784890151614641601f891682614554565b8355505b6001600288020188555050505b505050505050565b7f50726573616c65204c696d697420526561636865642e000000000000000000005f82015250565b5f61468e6016836138ca565b91506146998261465a565b602082019050919050565b5f6020820190508181035f8301526146bb81614682565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642e00000000000000005f82015250565b5f6146f66018836138ca565b9150614701826146c2565b602082019050919050565b5f6020820190508181035f830152614723816146ea565b9050919050565b7f496e76616c696420566f75636865722e2054727920416761696e2e00000000005f82015250565b5f61475e601b836138ca565b91506147698261472a565b602082019050919050565b5f6020820190508181035f83015261478b81614752565b9050919050565b5f81905092915050565b5f6147a6826138c0565b6147b08185614792565b93506147c08185602086016138da565b80840191505092915050565b5f6147d7828561479c565b91506147e3828461479c565b91508190509392505050565b7f4c696d697420526561636865642e0000000000000000000000000000000000005f82015250565b5f614823600e836138ca565b915061482e826147ef565b602082019050919050565b5f6020820190508181035f83015261485081614817565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6148b16026836138ca565b91506148bc82614857565b604082019050919050565b5f6020820190508181035f8301526148de816148a5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614909826148e5565b61491381856148ef565b93506149238185602086016138da565b61492c81613902565b840191505092915050565b5f60808201905061494a5f8301876139ef565b61495760208301866139ef565b61496460408301856137d4565b818103606083015261497681846148ff565b905095945050505050565b5f8151905061498f81613838565b92915050565b5f602082840312156149aa576149a9613805565b5b5f6149b784828501614981565b91505092915050565b5f6149ca826137cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149fc576149fb6140f2565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a3e826137cb565b9150614a49836137cb565b925082614a5957614a58614a07565b5b828204905092915050565b5f614a6e826137cb565b9150614a79836137cb565b9250828203905081811115614a9157614a906140f2565b5b92915050565b5f614aa1826137cb565b9150614aac836137cb565b925082614abc57614abb614a07565b5b828206905092915050565b5f819050919050565b614ad981614ac7565b82525050565b5f604082019050614af25f830185614ad0565b614aff60208301846137d4565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f614b676018836138ca565b9150614b7282614b33565b602082019050919050565b5f6020820190508181035f830152614b9481614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f614bcf601f836138ca565b9150614bda82614b9b565b602082019050919050565b5f6020820190508181035f830152614bfc81614bc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c5d6022836138ca565b9150614c6882614c03565b604082019050919050565b5f6020820190508181035f830152614c8a81614c51565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614ceb6022836138ca565b9150614cf682614c91565b604082019050919050565b5f6020820190508181035f830152614d1881614cdf565b9050919050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d53600283614792565b9150614d5e82614d1f565b600282019050919050565b5f819050919050565b614d83614d7e82614ac7565b614d69565b82525050565b5f614d9382614d47565b9150614d9f8285614d72565b602082019150614daf8284614d72565b6020820191508190509392505050565b5f60ff82169050919050565b614dd481614dbf565b82525050565b5f608082019050614ded5f830187614ad0565b614dfa6020830186614dcb565b614e076040830185614ad0565b614e146060830184614ad0565b95945050505050565b5f60a082019050614e305f830188614ad0565b614e3d6020830187614ad0565b614e4a6040830186614ad0565b614e5760608301856137d4565b614e6460808301846139ef565b969550505050505056fea26469706673582212209f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa8964736f6c6343000816003368747470733a2f2f706967656f6e737068617365346170692e76657263656c2e6170702f6170692f6e66742f
Deployed Bytecode
0x608060405260043610610265575f3560e01c80638da5cb5b11610143578063bc6cb080116100b5578063e03b41f011610079578063e03b41f0146108ab578063e5233047146108d5578063e57deb39146108f1578063e985e9c51461092d578063f2fde38b14610969578063f51f96dd1461099157610265565b8063bc6cb080146107d9578063bee53534146107f5578063c87b56dd1461081d578063cd594ffa14610859578063d5abeb011461088157610265565b8063a22cb46511610107578063a22cb465146106d1578063a79fdbb4146106f9578063ab34ee4f14610723578063b3a196e91461075f578063b88d4fde14610789578063b96502cb146107b157610265565b80638da5cb5b1461060f57806395d89b4114610639578063994a0ae714610663578063a0712d681461068d578063a0bcfc7f146106a957610265565b806340a72310116101dc5780636c0360eb116101a05780636c0360eb1461051b5780636f8b44b01461054557806370a082311461056d578063715018a6146105a95780638a0c5204146105bf5780638d92becd146105e757610265565b806340a723101461043d57806342842e0e1461046557806344e973781461048d5780635d08c1ae146104b55780636352211e146104df57610265565b806318160ddd1161022e57806318160ddd1461035d5780631919fed71461038757806323b872dd146103af578063318f0789146103d75780633549345e146103ff5780633ccfd60b1461042757610265565b80620e7fa81461026957806301ffc9a71461029357806306fdde03146102cf578063081812fc146102f9578063095ea7b314610335575b5f80fd5b348015610274575f80fd5b5061027d6109bb565b60405161028a91906137e3565b60405180910390f35b34801561029e575f80fd5b506102b960048036038101906102b49190613862565b6109c1565b6040516102c691906138a7565b60405180910390f35b3480156102da575f80fd5b506102e3610aa2565b6040516102f0919061394a565b60405180910390f35b348015610304575f80fd5b5061031f600480360381019061031a9190613994565b610b32565b60405161032c91906139fe565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190613a41565b610baa565b005b348015610368575f80fd5b50610371610cb3565b60405161037e91906137e3565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a89190613994565b610cc0565b005b3480156103ba575f80fd5b506103d560048036038101906103d09190613a7f565b610d46565b005b3480156103e2575f80fd5b506103fd60048036038101906103f89190613af9565b610d56565b005b34801561040a575f80fd5b5061042560048036038101906104209190613994565b610def565b005b348015610432575f80fd5b5061043b610e75565b005b348015610448575f80fd5b50610463600480360381019061045e9190613a41565b610f3c565b005b348015610470575f80fd5b5061048b60048036038101906104869190613a7f565b61101c565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613b24565b61103b565b005b3480156104c0575f80fd5b506104c96110fb565b6040516104d691906138a7565b60405180910390f35b3480156104ea575f80fd5b5061050560048036038101906105009190613994565b61110d565b60405161051291906139fe565b60405180910390f35b348015610526575f80fd5b5061052f611121565b60405161053c919061394a565b60405180910390f35b348015610550575f80fd5b5061056b60048036038101906105669190613994565b6111ad565b005b348015610578575f80fd5b50610593600480360381019061058e9190613b24565b611233565b6040516105a091906137e3565b60405180910390f35b3480156105b4575f80fd5b506105bd6112fd565b005b3480156105ca575f80fd5b506105e560048036038101906105e09190613c8f565b611384565b005b3480156105f2575f80fd5b5061060d60048036038101906106089190613af9565b611498565b005b34801561061a575f80fd5b50610623611530565b60405161063091906139fe565b60405180910390f35b348015610644575f80fd5b5061064d611557565b60405161065a919061394a565b60405180910390f35b34801561066e575f80fd5b506106776115e7565b60405161068491906138a7565b60405180910390f35b6106a760048036038101906106a29190613994565b6115fa565b005b3480156106b4575f80fd5b506106cf60048036038101906106ca9190613d86565b61173d565b005b3480156106dc575f80fd5b506106f760048036038101906106f29190613dcd565b6117cc565b005b348015610704575f80fd5b5061070d61193e565b60405161071a91906138a7565b60405180910390f35b34801561072e575f80fd5b5061074960048036038101906107449190613994565b611951565b60405161075691906137e3565b60405180910390f35b34801561076a575f80fd5b50610773611966565b60405161078091906137e3565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190613ea9565b61196c565b005b3480156107bc575f80fd5b506107d760048036038101906107d29190613994565b6119bf565b005b6107f360048036038101906107ee9190613f29565b611a45565b005b348015610800575f80fd5b5061081b60048036038101906108169190613af9565b611ce4565b005b348015610828575f80fd5b50610843600480360381019061083e9190613994565b611d7d565b604051610850919061394a565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190613994565b611e18565b005b34801561088c575f80fd5b50610895611e9e565b6040516108a291906137e3565b60405180910390f35b3480156108b6575f80fd5b506108bf611ea4565b6040516108cc91906137e3565b60405180910390f35b6108ef60048036038101906108ea9190613a41565b611eaa565b005b3480156108fc575f80fd5b5061091760048036038101906109129190613f95565b611ffa565b60405161092491906139fe565b60405180910390f35b348015610938575f80fd5b50610953600480360381019061094e9190613fef565b61200d565b60405161096091906138a7565b60405180910390f35b348015610974575f80fd5b5061098f600480360381019061098a9190613b24565b61209b565b005b34801561099c575f80fd5b506109a5612191565b6040516109b291906137e3565b60405180910390f35b600f5481565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9b5750610a9a82612197565b5b9050919050565b606060038054610ab19061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061405a565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f610b3c82612200565b610b72576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bb48261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3a612237565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6c5750610c6a81610c65612237565b61200d565b155b15610ca3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cae83838361223e565b505050565b5f60025460015403905090565b610cc8612237565b73ffffffffffffffffffffffffffffffffffffffff16610ce6611530565b73ffffffffffffffffffffffffffffffffffffffff1614610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906140d4565b60405180910390fd5b80600e8190555050565b610d518383836122ed565b505050565b610d5e612237565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611530565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906140d4565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610df7612237565b73ffffffffffffffffffffffffffffffffffffffff16610e15611530565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906140d4565b60405180910390fd5b80600f8190555050565b610e7d612237565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611530565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906140d4565b60405180910390fd5b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610f38573d5f803e3d5ffd5b5050565b610f44612237565b73ffffffffffffffffffffffffffffffffffffffff16610f62611530565b73ffffffffffffffffffffffffffffffffffffffff1614610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906140d4565b60405180910390fd5b60095481610fc4610cb3565b610fce919061411f565b1061100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061419c565b60405180910390fd5b61101882826127b7565b5050565b61103683838360405180602001604052805f81525061196c565b505050565b611043612237565b73ffffffffffffffffffffffffffffffffffffffff16611061611530565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906140d4565b60405180910390fd5b80600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5f9054906101000a900460ff1681565b5f611117826127d4565b5f01519050919050565b600a805461112e9061405a565b80601f016020809104026020016040519081016040528092919081815260200182805461115a9061405a565b80156111a55780601f1061117c576101008083540402835291602001916111a5565b820191905f5260205f20905b81548152906001019060200180831161118857829003601f168201915b505050505081565b6111b5612237565b73ffffffffffffffffffffffffffffffffffffffff166111d3611530565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906140d4565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611299576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611305612237565b73ffffffffffffffffffffffffffffffffffffffff16611323611530565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611370906140d4565b60405180910390fd5b6113825f612a3e565b565b61138c612237565b73ffffffffffffffffffffffffffffffffffffffff166113aa611530565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906140d4565b60405180910390fd5b600954815161140d610cb3565b611417919061411f565b10611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061419c565b60405180910390fd5b5f5b815181101561149457611487828281518110611478576114776141ba565b5b602002602001015160016127b7565b8080600101915050611459565b5050565b6114a0612237565b73ffffffffffffffffffffffffffffffffffffffff166114be611530565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906140d4565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115669061405a565b80601f01602080910402602001604051908101604052809291908181526020018280546115929061405a565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b5050505050905090565b600b60029054906101000a900460ff1681565b600b5f9054906101000a900460ff1615611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614231565b60405180910390fd5b5f811161168b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611682906142bf565b60405180910390fd5b600954611696610cb3565b826116a1919061411f565b106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614327565b60405180910390fd5b80600e546116ef9190614345565b3414611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906143d0565b60405180910390fd5b61173a33826127b7565b50565b611745612237565b73ffffffffffffffffffffffffffffffffffffffff16611763611530565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0906140d4565b60405180910390fd5b80600a90816117c8919061458b565b5050565b6117d4612237565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611838576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f611844612237565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ed612237565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193291906138a7565b60405180910390a35050565b600b60019054906101000a900460ff1681565b600c602052805f5260405f205f915090505481565b60105481565b6119778484846122ed565b61198384848484612aff565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119c7612237565b73ffffffffffffffffffffffffffffffffffffffff166119e5611530565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a32906140d4565b60405180910390fd5b8060108190555050565b600b60019054906101000a900460ff1615611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614231565b60405180910390fd5b5f8311611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142bf565b60405180910390fd5b600954611ae2610cb3565b84611aed919061411f565b10611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614327565b60405180910390fd5b601054611b38610cb3565b84611b43919061411f565b10611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906146a4565b60405180910390fd5b82600f54611b919190614345565b3414611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906143d0565b60405180910390fd5b600b60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c158383611ffa565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061470c565b60405180910390fd5b5f600c5f8481526020019081526020015f205414611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614774565b60405180910390fd5b611cc833846127b7565b6001600c5f8481526020019081526020015f2081905550505050565b611cec612237565b73ffffffffffffffffffffffffffffffffffffffff16611d0a611530565b73ffffffffffffffffffffffffffffffffffffffff1614611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140d4565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6060611d8882612200565b611dbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611dc7612c78565b90505f815103611de55760405180602001604052805f815250611e10565b80611def84612d08565b604051602001611e009291906147cc565b6040516020818303038152906040525b915050919050565b611e20612237565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611530565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b906140d4565b60405180910390fd5b80600d8190555050565b60095481565b600d5481565b600b60029054906101000a900460ff1615611ef1576040517f71cc92d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095481611efd610cb3565b611f07919061411f565b10611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e9061419c565b60405180910390fd5b80600d54611f559190614345565b3414611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d906143d0565b60405180910390fd5b601054611fa1610cb3565b82611fac919061411f565b10611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614839565b60405180910390fd5b611ff682826127b7565b5050565b5f6120058383612e61565b905092915050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6120a3612237565b73ffffffffffffffffffffffffffffffffffffffff166120c1611530565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e906140d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c906148c7565b60405180910390fd5b61218e81612a3e565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015482108015612230575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6122f7826127d4565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff1661231c612237565b73ffffffffffffffffffffffffffffffffffffffff16148061234e575061234d825f0151612348612237565b61200d565b5b80612393575061235c612237565b73ffffffffffffffffffffffffffffffffffffffff1661237b84610b32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614612434576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612499576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a68585856001612e81565b6124b45f84845f015161223e565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036127475760015481101561274657825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b08585856001612e87565b5050505050565b6127d0828260405180602001604052805f815250612e8d565b5050565b6127dc61378b565b5f829050600154811015612a07575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612a05575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146128f1578092505050612a39565b5b600115612a045781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146129ff578092505050612a39565b6128f2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f612b1f8473ffffffffffffffffffffffffffffffffffffffff16612e9f565b15612c6b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b48612237565b8786866040518563ffffffff1660e01b8152600401612b6a9493929190614937565b6020604051808303815f875af1925050508015612ba557506040513d601f19601f82011682018060405250810190612ba29190614995565b60015b612c1b573d805f8114612bd3576040519150601f19603f3d011682016040523d82523d5f602084013e612bd8565b606091505b505f815103612c13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c70565b600190505b949350505050565b6060600a8054612c879061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb39061405a565b8015612cfe5780601f10612cd557610100808354040283529160200191612cfe565b820191905f5260205f20905b815481529060010190602001808311612ce157829003601f168201915b5050505050905090565b60605f8203612d4e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5c565b5f8290505f5b5f8214612d7d578080612d66906149c0565b915050600a82612d769190614a34565b9150612d54565b5f8167ffffffffffffffff811115612d9857612d97613b53565b5b6040519080825280601f01601f191660200182016040528015612dca5781602001600182028036833780820191505090505b5090505b5f8514612e5557600182612de29190614a64565b9150600a85612df19190614a97565b6030612dfd919061411f565b60f81b818381518110612e1357612e126141ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612e4e9190614a34565b9450612dce565b8093505050505b919050565b5f80612e6c84612eb0565b9050612e788184612f09565b91505092915050565b50505050565b50505050565b612e9a8383836001612f2e565b505050565b5f80823b90505f8111915050919050565b5f612f027f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001612ee7929190614adf565b6040516020818303038152906040528051906020012061324d565b9050919050565b5f805f612f168585613266565b91509150612f23816132e1565b819250505092915050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612fd2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fde5f868387612e81565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561323157818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131e557506131e35f888488612aff565b155b1561321c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061316c565b5080600181905550506132465f868387612e87565b5050505050565b5f61325f6132596134ac565b836135c5565b9050919050565b5f8060418351036132a3575f805f602086015192506040860151915060608601515f1a9050613297878285856135f7565b945094505050506132da565b60408351036132d2575f8060208501519150604085015190506132c78683836136f8565b9350935050506132da565b5f6002915091505b9250929050565b5f60048111156132f4576132f3614b06565b5b81600481111561330757613306614b06565b5b03156134a9576001600481111561332157613320614b06565b5b81600481111561333457613333614b06565b5b03613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b90614b7d565b60405180910390fd5b6002600481111561338857613387614b06565b5b81600481111561339b5761339a614b06565b5b036133db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d290614be5565b60405180910390fd5b600360048111156133ef576133ee614b06565b5b81600481111561340257613401614b06565b5b03613442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343990614c73565b60405180910390fd5b60048081111561345557613454614b06565b5b81600481111561346857613467614b06565b5b036134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614d01565b60405180910390fd5b5b50565b5f7f0000000000000000000000004b220f065eba36ee1ffb67df04561c86988be62f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561352757507f000000000000000000000000000000000000000000000000000000000000000146145b15613554577f0f0e93dbd13d5dd21e4e509d9f8ea2aa2dfcd6d0e9d77e98b99012dfc88fb29b90506135c2565b6135bf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f7465fde7fb0420a03855c8bac7d7dd705d61d0241d0d293890335916e0da8ea27fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613752565b90505b90565b5f82826040516020016135d9929190614d89565b60405160208183030381529060405280519060200120905092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c111561362f575f6003915091506136ef565b601b8560ff16141580156136475750601c8560ff1614155b15613658575f6004915091506136ef565b5f6001878787876040515f815260200160405260405161367b9493929190614dda565b6020604051602081039080840390855afa15801561369b573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136e7575f600192509250506136ef565b805f92509250505b94509492505050565b5f805f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b841690505f601b60ff865f1c901c613736919061411f565b9050613744878288856135f7565b935093505050935093915050565b5f838383463060405160200161376c959493929190614e1d565b6040516020818303038152906040528051906020012090509392505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f819050919050565b6137dd816137cb565b82525050565b5f6020820190506137f65f8301846137d4565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138418161380d565b811461384b575f80fd5b50565b5f8135905061385c81613838565b92915050565b5f6020828403121561387757613876613805565b5b5f6138848482850161384e565b91505092915050565b5f8115159050919050565b6138a18161388d565b82525050565b5f6020820190506138ba5f830184613898565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156138f75780820151818401526020810190506138dc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61391c826138c0565b61392681856138ca565b93506139368185602086016138da565b61393f81613902565b840191505092915050565b5f6020820190508181035f8301526139628184613912565b905092915050565b613973816137cb565b811461397d575f80fd5b50565b5f8135905061398e8161396a565b92915050565b5f602082840312156139a9576139a8613805565b5b5f6139b684828501613980565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139e8826139bf565b9050919050565b6139f8816139de565b82525050565b5f602082019050613a115f8301846139ef565b92915050565b613a20816139de565b8114613a2a575f80fd5b50565b5f81359050613a3b81613a17565b92915050565b5f8060408385031215613a5757613a56613805565b5b5f613a6485828601613a2d565b9250506020613a7585828601613980565b9150509250929050565b5f805f60608486031215613a9657613a95613805565b5b5f613aa386828701613a2d565b9350506020613ab486828701613a2d565b9250506040613ac586828701613980565b9150509250925092565b613ad88161388d565b8114613ae2575f80fd5b50565b5f81359050613af381613acf565b92915050565b5f60208284031215613b0e57613b0d613805565b5b5f613b1b84828501613ae5565b91505092915050565b5f60208284031215613b3957613b38613805565b5b5f613b4684828501613a2d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b8982613902565b810181811067ffffffffffffffff82111715613ba857613ba7613b53565b5b80604052505050565b5f613bba6137fc565b9050613bc68282613b80565b919050565b5f67ffffffffffffffff821115613be557613be4613b53565b5b602082029050602081019050919050565b5f80fd5b5f613c0c613c0784613bcb565b613bb1565b90508083825260208201905060208402830185811115613c2f57613c2e613bf6565b5b835b81811015613c585780613c448882613a2d565b845260208401935050602081019050613c31565b5050509392505050565b5f82601f830112613c7657613c75613b4f565b5b8135613c86848260208601613bfa565b91505092915050565b5f60208284031215613ca457613ca3613805565b5b5f82013567ffffffffffffffff811115613cc157613cc0613809565b5b613ccd84828501613c62565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115613cf457613cf3613b53565b5b613cfd82613902565b9050602081019050919050565b828183375f83830152505050565b5f613d2a613d2584613cda565b613bb1565b905082815260208101848484011115613d4657613d45613cd6565b5b613d51848285613d0a565b509392505050565b5f82601f830112613d6d57613d6c613b4f565b5b8135613d7d848260208601613d18565b91505092915050565b5f60208284031215613d9b57613d9a613805565b5b5f82013567ffffffffffffffff811115613db857613db7613809565b5b613dc484828501613d59565b91505092915050565b5f8060408385031215613de357613de2613805565b5b5f613df085828601613a2d565b9250506020613e0185828601613ae5565b9150509250929050565b5f67ffffffffffffffff821115613e2557613e24613b53565b5b613e2e82613902565b9050602081019050919050565b5f613e4d613e4884613e0b565b613bb1565b905082815260208101848484011115613e6957613e68613cd6565b5b613e74848285613d0a565b509392505050565b5f82601f830112613e9057613e8f613b4f565b5b8135613ea0848260208601613e3b565b91505092915050565b5f805f8060808587031215613ec157613ec0613805565b5b5f613ece87828801613a2d565b9450506020613edf87828801613a2d565b9350506040613ef087828801613980565b925050606085013567ffffffffffffffff811115613f1157613f10613809565b5b613f1d87828801613e7c565b91505092959194509250565b5f805f60608486031215613f4057613f3f613805565b5b5f613f4d86828701613980565b9350506020613f5e86828701613980565b925050604084013567ffffffffffffffff811115613f7f57613f7e613809565b5b613f8b86828701613e7c565b9150509250925092565b5f8060408385031215613fab57613faa613805565b5b5f613fb885828601613980565b925050602083013567ffffffffffffffff811115613fd957613fd8613809565b5b613fe585828601613e7c565b9150509250929050565b5f806040838503121561400557614004613805565b5b5f61401285828601613a2d565b925050602061402385828601613a2d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061407157607f821691505b6020821081036140845761408361402d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6140be6020836138ca565b91506140c98261408a565b602082019050919050565b5f6020820190508181035f8301526140eb816140b2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614129826137cb565b9150614134836137cb565b925082820190508082111561414c5761414b6140f2565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f6141866013836138ca565b915061419182614152565b602082019050919050565b5f6020820190508181035f8301526141b38161417a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f61421b600f836138ca565b9150614226826141e7565b602082019050919050565b5f6020820190508181035f8301526142488161420f565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f6142a9602e836138ca565b91506142b48261424f565b604082019050919050565b5f6020820190508181035f8301526142d68161429d565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6143116008836138ca565b915061431c826142dd565b602082019050919050565b5f6020820190508181035f83015261433e81614305565b9050919050565b5f61434f826137cb565b915061435a836137cb565b9250828202614368816137cb565b9150828204841483151761437f5761437e6140f2565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f6143ba601b836138ca565b91506143c582614386565b602082019050919050565b5f6020820190508181035f8301526143e7816143ae565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261444a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261440f565b614454868361440f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61448f61448a614485846137cb565b61446c565b6137cb565b9050919050565b5f819050919050565b6144a883614475565b6144bc6144b482614496565b84845461441b565b825550505050565b5f90565b6144d06144c4565b6144db81848461449f565b505050565b5b818110156144fe576144f35f826144c8565b6001810190506144e1565b5050565b601f82111561454357614514816143ee565b61451d84614400565b8101602085101561452c578190505b61454061453885614400565b8301826144e0565b50505b505050565b5f82821c905092915050565b5f6145635f1984600802614548565b1980831691505092915050565b5f61457b8383614554565b9150826002028217905092915050565b614594826138c0565b67ffffffffffffffff8111156145ad576145ac613b53565b5b6145b7825461405a565b6145c2828285614502565b5f60209050601f8311600181146145f3575f84156145e1578287015190505b6145eb8582614570565b865550614652565b601f198416614601866143ee565b5f5b8281101561462857848901518255600182019150602085019450602081019050614603565b868310156146455784890151614641601f891682614554565b8355505b6001600288020188555050505b505050505050565b7f50726573616c65204c696d697420526561636865642e000000000000000000005f82015250565b5f61468e6016836138ca565b91506146998261465a565b602082019050919050565b5f6020820190508181035f8301526146bb81614682565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642e00000000000000005f82015250565b5f6146f66018836138ca565b9150614701826146c2565b602082019050919050565b5f6020820190508181035f830152614723816146ea565b9050919050565b7f496e76616c696420566f75636865722e2054727920416761696e2e00000000005f82015250565b5f61475e601b836138ca565b91506147698261472a565b602082019050919050565b5f6020820190508181035f83015261478b81614752565b9050919050565b5f81905092915050565b5f6147a6826138c0565b6147b08185614792565b93506147c08185602086016138da565b80840191505092915050565b5f6147d7828561479c565b91506147e3828461479c565b91508190509392505050565b7f4c696d697420526561636865642e0000000000000000000000000000000000005f82015250565b5f614823600e836138ca565b915061482e826147ef565b602082019050919050565b5f6020820190508181035f83015261485081614817565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6148b16026836138ca565b91506148bc82614857565b604082019050919050565b5f6020820190508181035f8301526148de816148a5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614909826148e5565b61491381856148ef565b93506149238185602086016138da565b61492c81613902565b840191505092915050565b5f60808201905061494a5f8301876139ef565b61495760208301866139ef565b61496460408301856137d4565b818103606083015261497681846148ff565b905095945050505050565b5f8151905061498f81613838565b92915050565b5f602082840312156149aa576149a9613805565b5b5f6149b784828501614981565b91505092915050565b5f6149ca826137cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149fc576149fb6140f2565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a3e826137cb565b9150614a49836137cb565b925082614a5957614a58614a07565b5b828204905092915050565b5f614a6e826137cb565b9150614a79836137cb565b9250828203905081811115614a9157614a906140f2565b5b92915050565b5f614aa1826137cb565b9150614aac836137cb565b925082614abc57614abb614a07565b5b828206905092915050565b5f819050919050565b614ad981614ac7565b82525050565b5f604082019050614af25f830185614ad0565b614aff60208301846137d4565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f614b676018836138ca565b9150614b7282614b33565b602082019050919050565b5f6020820190508181035f830152614b9481614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f614bcf601f836138ca565b9150614bda82614b9b565b602082019050919050565b5f6020820190508181035f830152614bfc81614bc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c5d6022836138ca565b9150614c6882614c03565b604082019050919050565b5f6020820190508181035f830152614c8a81614c51565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614ceb6022836138ca565b9150614cf682614c91565b604082019050919050565b5f6020820190508181035f830152614d1881614cdf565b9050919050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d53600283614792565b9150614d5e82614d1f565b600282019050919050565b5f819050919050565b614d83614d7e82614ac7565b614d69565b82525050565b5f614d9382614d47565b9150614d9f8285614d72565b602082019150614daf8284614d72565b6020820191508190509392505050565b5f60ff82169050919050565b614dd481614dbf565b82525050565b5f608082019050614ded5f830187614ad0565b614dfa6020830186614dcb565b614e076040830185614ad0565b614e146060830184614ad0565b95945050505050565b5f60a082019050614e305f830188614ad0565b614e3d6020830187614ad0565b614e4a6040830186614ad0565b614e5760608301856137d4565b614e6460808301846139ef565b969550505050505056fea26469706673582212209f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa8964736f6c63430008160033
Deployed Bytecode Sourcemap
55095:4838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55741:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25461:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28821:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30324:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29887:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25110:279;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59059:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31181:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58853:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59253:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59777:153;;;;;;;;;;;;;:::i;:::-;;56215:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31422:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59457:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55403:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28630:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55324:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59564:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25830:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14227:94;;;;;;;;;;;;;:::i;:::-;;55944:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58758:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13576:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28990:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55479:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56922:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58660:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30600:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55439:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55606:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55787:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31678:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59152:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57370:761;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58958:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29165:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59352:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55290:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55654:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56428:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58139:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30950:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14476:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55700:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55741:37;;;;:::o;25461:305::-;25563:4;25615:25;25600:40;;;:11;:40;;;;:105;;;;25672:33;25657:48;;;:11;:48;;;;25600:105;:158;;;;25722:36;25746:11;25722:23;:36::i;:::-;25600:158;25580:178;;25461:305;;;:::o;28821:100::-;28875:13;28908:5;28901:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28821:100;:::o;30324:204::-;30392:7;30417:16;30425:7;30417;:16::i;:::-;30412:64;;30442:34;;;;;;;;;;;;;;30412:64;30496:15;:24;30512:7;30496:24;;;;;;;;;;;;;;;;;;;;;30489:31;;30324:204;;;:::o;29887:371::-;29960:13;29976:24;29992:7;29976:15;:24::i;:::-;29960:40;;30021:5;30015:11;;:2;:11;;;30011:48;;30035:24;;;;;;;;;;;;;;30011:48;30092:5;30076:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30102:37;30119:5;30126:12;:10;:12::i;:::-;30102:16;:37::i;:::-;30101:38;30076:63;30072:138;;;30163:35;;;;;;;;;;;;;;30072:138;30222:28;30231:2;30235:7;30244:5;30222:8;:28::i;:::-;29949:309;29887:371;;:::o;25110:279::-;25162:7;25354:12;;25338:13;;:28;25331:35;;25110:279;:::o;59059:87::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59134:4:::1;59122:9;:16;;;;59059:87:::0;:::o;31181:170::-;31315:28;31325:4;31331:2;31335:7;31315:9;:28::i;:::-;31181:170;;;:::o;58853:99::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58940:4:::1;58922:15;;:22;;;;;;;;;;;;;;;;;;58853:99:::0;:::o;59253:93::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59334:4:::1;59319:12;:19;;;;59253:93:::0;:::o;59777:153::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59827:13:::1;59843:21;59827:37;;59883:10;59875:28;;:38;59904:8;59875:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59816:114;59777:153::o:0;56215:207::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56338:9:::1;;56329:6;56313:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;56305:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56386:28;56396:9;56407:6;56386:9;:28::i;:::-;56215:207:::0;;:::o;31422:185::-;31560:39;31577:4;31583:2;31587:7;31560:39;;;;;;;;;;;;:16;:39::i;:::-;31422:185;;;:::o;59457:99::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59545:3:::1;59527:15;;:21;;;;;;;;;;;;;;;;;;59457:99:::0;:::o;55403:29::-;;;;;;;;;;;;;:::o;28630:124::-;28694:7;28721:20;28733:7;28721:11;:20::i;:::-;:25;;;28714:32;;28630:124;;;:::o;55324:70::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59564:88::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59639:5:::1;59627:9;:17;;;;59564:88:::0;:::o;25830:206::-;25894:7;25935:1;25918:19;;:5;:19;;;25914:60;;25946:28;;;;;;;;;;;;;;25914:60;26000:12;:19;26013:5;26000:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25992:36;;25985:43;;25830:206;;;:::o;14227:94::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14292:21:::1;14310:1;14292:9;:21::i;:::-;14227:94::o:0;55944:265::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56077:9:::1;;56059:8;:15;56043:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:43;56035:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56125:6;56121:80;56141:8;:15;56137:1;:19;56121:80;;;56176:25;56186:8;56195:1;56186:11;;;;;;;;:::i;:::-;;;;;;;;56199:1;56176:9;:25::i;:::-;56158:3;;;;;;;56121:80;;;;55944:265:::0;:::o;58758:89::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58835:4:::1;58822:10;;:17;;;;;;;;;;;;;;;;;;58758:89:::0;:::o;13576:87::-;13622:7;13649:6;;;;;;;;;;;13642:13;;13576:87;:::o;28990:104::-;29046:13;29079:7;29072:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:104;:::o;55479:35::-;;;;;;;;;;;;;:::o;56922:440::-;57024:10;;;;;;;;;;;57023:11;57015:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57085:1;57073:9;:13;57065:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57184:9;;57168:13;:11;:13::i;:::-;57156:9;:25;;;;:::i;:::-;:37;57148:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57250:9;57238;;:21;;;;:::i;:::-;57225:9;:34;57217:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57322:32;57332:10;57344:9;57322;:32::i;:::-;56922:440;:::o;58660:92::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58740:4:::1;58730:7;:14;;;;;;:::i;:::-;;58660:92:::0;:::o;30600:279::-;30703:12;:10;:12::i;:::-;30691:24;;:8;:24;;;30687:54;;30724:17;;;;;;;;;;;;;;30687:54;30799:8;30754:18;:32;30773:12;:10;:12::i;:::-;30754:32;;;;;;;;;;;;;;;:42;30787:8;30754:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30852:8;30823:48;;30838:12;:10;:12::i;:::-;30823:48;;;30862:8;30823:48;;;;;;:::i;:::-;;;;;;;;30600:279;;:::o;55439:33::-;;;;;;;;;;;;;:::o;55606:39::-;;;;;;;;;;;;;;;;;:::o;55787:31::-;;;;:::o;31678:342::-;31845:28;31855:4;31861:2;31865:7;31845:9;:28::i;:::-;31889:48;31912:4;31918:2;31922:7;31931:5;31889:22;:48::i;:::-;31884:129;;31961:40;;;;;;;;;;;;;;31884:129;31678:342;;;;:::o;59152:95::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59235:4:::1;59219:13;:20;;;;59152:95:::0;:::o;57370:761::-;57515:13;;;;;;;;;;;57514:14;57506:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;57579:1;57567:9;:13;57559:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57678:9;;57662:13;:11;:13::i;:::-;57650:9;:25;;;;:::i;:::-;:37;57642:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57747:13;;57731;:11;:13::i;:::-;57719:9;:25;;;;:::i;:::-;:41;57711:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57834:9;57819:12;;:24;;;;:::i;:::-;57806:9;:37;57798:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57917:15;;;;;;;;;;;57894:38;;:19;57900:2;57903:9;57894:5;:19::i;:::-;:38;;;57886:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57998:1;57980:10;:14;57991:2;57980:14;;;;;;;;;;;;:19;57972:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58062:32;58072:10;58084:9;58062;:32::i;:::-;58122:1;58105:10;:14;58116:2;58105:14;;;;;;;;;;;:18;;;;57370:761;;;:::o;58958:95::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59041:4:::1;59025:13;;:20;;;;;;;;;;;;;;;;;;58958:95:::0;:::o;29165:318::-;29238:13;29269:16;29277:7;29269;:16::i;:::-;29264:59;;29294:29;;;;;;;;;;;;;;29264:59;29336:21;29360:10;:8;:10::i;:::-;29336:34;;29413:1;29394:7;29388:21;:26;:87;;;;;;;;;;;;;;;;;29441:7;29450:18;:7;:16;:18::i;:::-;29424:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29388:87;29381:94;;;29165:318;;;:::o;59352:97::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59437:4:::1;59420:14;:21;;;;59352:97:::0;:::o;55290:27::-;;;;:::o;55654:39::-;;;;:::o;56428:488::-;56503:15;;;;;;;;;;;56500:67;;;56541:14;;;;;;;;;;;;;;56500:67;56622:9;;56611:8;56595:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;56587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56704:8;56687:14;;:25;;;;:::i;:::-;56674:9;:38;56666:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56790:13;;56774;:11;:13::i;:::-;56763:8;:24;;;;:::i;:::-;:40;56755:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56835:23;56845:2;56849:8;56835:9;:23::i;:::-;56428:488;;:::o;58139:124::-;58207:7;58233:22;58241:2;58245:9;58233:7;:22::i;:::-;58226:29;;58139:124;;;;:::o;30950:164::-;31047:4;31071:18;:25;31090:5;31071:25;;;;;;;;;;;;;;;:35;31097:8;31071:35;;;;;;;;;;;;;;;;;;;;;;;;;31064:42;;30950:164;;;;:::o;14476:192::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14585:1:::1;14565:22;;:8;:22;;::::0;14557:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14641:19;14651:8;14641:9;:19::i;:::-;14476:192:::0;:::o;55700:34::-;;;;:::o;15581:157::-;15666:4;15705:25;15690:40;;;:11;:40;;;;15683:47;;15581:157;;;:::o;32275:144::-;32332:4;32366:13;;32356:7;:23;:55;;;;;32384:11;:20;32396:7;32384:20;;;;;;;;;;;:27;;;;;;;;;;;;32383:28;32356:55;32349:62;;32275:144;;;:::o;716:98::-;769:7;796:10;789:17;;716:98;:::o;39481:196::-;39623:2;39596:15;:24;39612:7;39596:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39661:7;39657:2;39641:28;;39650:5;39641:28;;;;;;;;;;;;39481:196;;;:::o;34982:2112::-;35097:35;35135:20;35147:7;35135:11;:20::i;:::-;35097:58;;35168:22;35210:13;:18;;;35194:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35245:50;35262:13;:18;;;35282:12;:10;:12::i;:::-;35245:16;:50::i;:::-;35194:101;:154;;;;35336:12;:10;:12::i;:::-;35312:36;;:20;35324:7;35312:11;:20::i;:::-;:36;;;35194:154;35168:181;;35367:17;35362:66;;35393:35;;;;;;;;;;;;;;35362:66;35465:4;35443:26;;:13;:18;;;:26;;;35439:67;;35478:28;;;;;;;;;;;;;;35439:67;35535:1;35521:16;;:2;:16;;;35517:52;;35546:23;;;;;;;;;;;;;;35517:52;35582:43;35604:4;35610:2;35614:7;35623:1;35582:21;:43::i;:::-;35690:49;35707:1;35711:7;35720:13;:18;;;35690:8;:49::i;:::-;36065:1;36035:12;:18;36048:4;36035:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36109:1;36081:12;:16;36094:2;36081:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36155:2;36127:11;:20;36139:7;36127:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36217:15;36172:11;:20;36184:7;36172:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36485:19;36517:1;36507:7;:11;36485:33;;36578:1;36537:43;;:11;:24;36549:11;36537:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36533:445;;36762:13;;36748:11;:27;36744:219;;;36832:13;:18;;;36800:11;:24;36812:11;36800:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;36915:13;:28;;;36873:11;:24;36885:11;36873:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;36744:219;36533:445;36010:979;37025:7;37021:2;37006:27;;37015:4;37006:27;;;;;;;;;;;;37044:42;37065:4;37071:2;37075:7;37084:1;37044:20;:42::i;:::-;35086:2008;;34982:2112;;;:::o;32427:104::-;32496:27;32506:2;32510:8;32496:27;;;;;;;;;;;;:9;:27::i;:::-;32427:104;;:::o;27485:1083::-;27546:21;;:::i;:::-;27580:12;27595:7;27580:22;;27651:13;;27644:4;:20;27640:861;;;27685:31;27719:11;:17;27731:4;27719:17;;;;;;;;;;;27685:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27760:9;:16;;;27755:731;;27831:1;27805:28;;:9;:14;;;:28;;;27801:101;;27869:9;27862:16;;;;;;27801:101;28206:261;28213:4;28206:261;;;28246:6;;;;;;;;28291:11;:17;28303:4;28291:17;;;;;;;;;;;28279:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28365:1;28339:28;;:9;:14;;;:28;;;28335:109;;28407:9;28400:16;;;;;;28335:109;28206:261;;;27755:731;27666:835;27640:861;28529:31;;;;;;;;;;;;;;27485:1083;;;;:::o;14676:173::-;14732:16;14751:6;;;;;;;;;;;14732:25;;14777:8;14768:6;;:17;;;;;;;;;;;;;;;;;;14832:8;14801:40;;14822:8;14801:40;;;;;;;;;;;;14721:128;14676:173;:::o;40242:790::-;40397:4;40418:15;:2;:13;;;:15::i;:::-;40414:611;;;40470:2;40454:36;;;40491:12;:10;:12::i;:::-;40505:4;40511:7;40520:5;40454:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40450:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40717:1;40700:6;:13;:18;40696:259;;40750:40;;;;;;;;;;;;;;40696:259;40905:6;40899:13;40890:6;40886:2;40882:15;40875:38;40450:520;40587:45;;;40577:55;;;:6;:55;;;;40570:62;;;;;40414:611;41009:4;41002:11;;40242:790;;;;;;;:::o;59660:108::-;59720:13;59753:7;59746:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59660:108;:::o;1181:723::-;1237:13;1467:1;1458:5;:10;1454:53;;1485:10;;;;;;;;;;;;;;;;;;;;;1454:53;1517:12;1532:5;1517:20;;1548:14;1573:78;1588:1;1580:4;:9;1573:78;;1606:8;;;;;:::i;:::-;;;;1637:2;1629:10;;;;;:::i;:::-;;;1573:78;;;1661:19;1693:6;1683:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1661:39;;1711:154;1727:1;1718:5;:10;1711:154;;1755:1;1745:11;;;;;:::i;:::-;;;1822:2;1814:5;:10;;;;:::i;:::-;1801:2;:24;;;;:::i;:::-;1788:39;;1771:6;1778;1771:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1851:2;1842:11;;;;;:::i;:::-;;;1711:154;;;1889:6;1875:21;;;;;1181:723;;;;:::o;58271:175::-;58343:7;58362:14;58379:9;58385:2;58379:5;:9::i;:::-;58362:26;;58406:32;58420:6;58428:9;58406:13;:32::i;:::-;58399:39;;;58271:175;;;;:::o;41680:159::-;;;;;:::o;42498:158::-;;;;;:::o;32894:163::-;33017:32;33023:2;33027:8;33037:5;33044:4;33017:5;:32::i;:::-;32894:163;;;:::o;3646:387::-;3706:4;3914:12;3981:7;3969:20;3961:28;;4024:1;4017:4;:8;4010:15;;;3646:387;;;:::o;58454:196::-;58500:7;58526:116;58578:34;58627:2;58553:87;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58543:98;;;;;;58526:16;:116::i;:::-;58519:123;;58454:196;;;:::o;46688:231::-;46766:7;46787:17;46806:18;46828:27;46839:4;46845:9;46828:10;:27::i;:::-;46786:69;;;;46866:18;46878:5;46866:11;:18::i;:::-;46902:9;46895:16;;;;46688:231;;;;:::o;33316:1412::-;33455:20;33478:13;;33455:36;;33520:1;33506:16;;:2;:16;;;33502:48;;33531:19;;;;;;;;;;;;;;33502:48;33577:1;33565:8;:13;33561:44;;33587:18;;;;;;;;;;;;;;33561:44;33618:61;33648:1;33652:2;33656:12;33670:8;33618:21;:61::i;:::-;33991:8;33956:12;:16;33969:2;33956:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34055:8;34015:12;:16;34028:2;34015:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34114:2;34081:11;:25;34093:12;34081:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34181:15;34131:11;:25;34143:12;34131:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34214:20;34237:12;34214:35;;34271:9;34266:328;34286:8;34282:1;:12;34266:328;;;34350:12;34346:2;34325:38;;34342:1;34325:38;;;;;;;;;;;;34386:4;:68;;;;;34395:59;34426:1;34430:2;34434:12;34448:5;34395:22;:59::i;:::-;34394:60;34386:68;34382:164;;;34486:40;;;;;;;;;;;;;;34382:164;34564:14;;;;;;;34296:3;;;;;;;34266:328;;;;34626:12;34610:13;:28;;;;33931:719;34660:60;34689:1;34693:2;34697:12;34711:8;34660:20;:60::i;:::-;33444:1284;33316:1412;;;;:::o;54921:167::-;54998:7;55025:55;55047:20;:18;:20::i;:::-;55069:10;55025:21;:55::i;:::-;55018:62;;54921:167;;;:::o;44578:1308::-;44659:7;44668:12;44913:2;44893:9;:16;:22;44889:990;;44932:9;44956;44980:7;45189:4;45178:9;45174:20;45168:27;45163:32;;45239:4;45228:9;45224:20;45218:27;45213:32;;45297:4;45286:9;45282:20;45276:27;45273:1;45268:36;45263:41;;45340:25;45351:4;45357:1;45360;45363;45340:10;:25::i;:::-;45333:32;;;;;;;;;44889:990;45407:2;45387:9;:16;:22;45383:496;;45426:9;45450:10;45662:4;45651:9;45647:20;45641:27;45636:32;;45713:4;45702:9;45698:20;45692:27;45686:33;;45755:23;45766:4;45772:1;45775:2;45755:10;:23::i;:::-;45748:30;;;;;;;;45383:496;45827:1;45831:35;45811:56;;;;44578:1308;;;;;;:::o;42849:643::-;42927:20;42918:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;42914:571;42964:7;42914:571;43025:29;43016:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;43012:473;;43071:34;;;;;;;;;;:::i;:::-;;;;;;;;43012:473;43136:35;43127:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;43123:362;;43188:41;;;;;;;;;;:::i;:::-;;;;;;;;43123:362;43260:30;43251:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43247:238;;43307:44;;;;;;;;;;:::i;:::-;;;;;;;;43247:238;43382:30;43373:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43369:116;;43429:44;;;;;;;;;;:::i;:::-;;;;;;;;43369:116;42849:643;;:::o;53694:314::-;53747:7;53788:12;53771:29;;53779:4;53771:29;;;:66;;;;;53821:16;53804:13;:33;53771:66;53767:234;;;53861:24;53854:31;;;;53767:234;53925:64;53947:10;53959:12;53973:15;53925:21;:64::i;:::-;53918:71;;53694:314;;:::o;51602:196::-;51695:7;51761:15;51778:10;51732:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51722:68;;;;;;51715:75;;51602:196;;;;:::o;48140:1632::-;48271:7;48280:12;49205:66;49200:1;49192:10;;:79;49188:163;;;49304:1;49308:30;49288:51;;;;;;49188:163;49370:2;49365:1;:7;;;;:18;;;;;49381:2;49376:1;:7;;;;49365:18;49361:102;;;49416:1;49420:30;49400:51;;;;;;49361:102;49560:14;49577:24;49587:4;49593:1;49596;49599;49577:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49560:41;;49634:1;49616:20;;:6;:20;;;49612:103;;49669:1;49673:29;49653:50;;;;;;;49612:103;49735:6;49743:20;49727:37;;;;;48140:1632;;;;;;;;:::o;47182:344::-;47296:7;47305:12;47330:9;47355:66;47347:75;;47342:2;:80;47330:92;;47433:7;47472:2;47465:3;47458:2;47450:11;;:18;;47449:25;;;;:::i;:::-;47433:42;;47493:25;47504:4;47510:1;47513;47516;47493:10;:25::i;:::-;47486:32;;;;;;47182:344;;;;;;:::o;54016:263::-;54160:7;54208:8;54218;54228:11;54241:13;54264:4;54197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54187:84;;;;;;54180:91;;54016:263;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:116::-;5937:21;5952:5;5937:21;:::i;:::-;5930:5;5927:32;5917:60;;5973:1;5970;5963:12;5917:60;5867:116;:::o;5989:133::-;6032:5;6070:6;6057:20;6048:29;;6086:30;6110:5;6086:30;:::i;:::-;5989:133;;;;:::o;6128:323::-;6184:6;6233:2;6221:9;6212:7;6208:23;6204:32;6201:119;;;6239:79;;:::i;:::-;6201:119;6359:1;6384:50;6426:7;6417:6;6406:9;6402:22;6384:50;:::i;:::-;6374:60;;6330:114;6128:323;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:117::-;6901:1;6898;6891:12;6915:180;6963:77;6960:1;6953:88;7060:4;7057:1;7050:15;7084:4;7081:1;7074:15;7101:281;7184:27;7206:4;7184:27;:::i;:::-;7176:6;7172:40;7314:6;7302:10;7299:22;7278:18;7266:10;7263:34;7260:62;7257:88;;;7325:18;;:::i;:::-;7257:88;7365:10;7361:2;7354:22;7144:238;7101:281;;:::o;7388:129::-;7422:6;7449:20;;:::i;:::-;7439:30;;7478:33;7506:4;7498:6;7478:33;:::i;:::-;7388:129;;;:::o;7523:311::-;7600:4;7690:18;7682:6;7679:30;7676:56;;;7712:18;;:::i;:::-;7676:56;7762:4;7754:6;7750:17;7742:25;;7822:4;7816;7812:15;7804:23;;7523:311;;;:::o;7840:117::-;7949:1;7946;7939:12;7980:710;8076:5;8101:81;8117:64;8174:6;8117:64;:::i;:::-;8101:81;:::i;:::-;8092:90;;8202:5;8231:6;8224:5;8217:21;8265:4;8258:5;8254:16;8247:23;;8318:4;8310:6;8306:17;8298:6;8294:30;8347:3;8339:6;8336:15;8333:122;;;8366:79;;:::i;:::-;8333:122;8481:6;8464:220;8498:6;8493:3;8490:15;8464:220;;;8573:3;8602:37;8635:3;8623:10;8602:37;:::i;:::-;8597:3;8590:50;8669:4;8664:3;8660:14;8653:21;;8540:144;8524:4;8519:3;8515:14;8508:21;;8464:220;;;8468:21;8082:608;;7980:710;;;;;:::o;8713:370::-;8784:5;8833:3;8826:4;8818:6;8814:17;8810:27;8800:122;;8841:79;;:::i;:::-;8800:122;8958:6;8945:20;8983:94;9073:3;9065:6;9058:4;9050:6;9046:17;8983:94;:::i;:::-;8974:103;;8790:293;8713:370;;;;:::o;9089:539::-;9173:6;9222:2;9210:9;9201:7;9197:23;9193:32;9190:119;;;9228:79;;:::i;:::-;9190:119;9376:1;9365:9;9361:17;9348:31;9406:18;9398:6;9395:30;9392:117;;;9428:79;;:::i;:::-;9392:117;9533:78;9603:7;9594:6;9583:9;9579:22;9533:78;:::i;:::-;9523:88;;9319:302;9089:539;;;;:::o;9634:117::-;9743:1;9740;9733:12;9757:308;9819:4;9909:18;9901:6;9898:30;9895:56;;;9931:18;;:::i;:::-;9895:56;9969:29;9991:6;9969:29;:::i;:::-;9961:37;;10053:4;10047;10043:15;10035:23;;9757:308;;;:::o;10071:146::-;10168:6;10163:3;10158;10145:30;10209:1;10200:6;10195:3;10191:16;10184:27;10071:146;;;:::o;10223:425::-;10301:5;10326:66;10342:49;10384:6;10342:49;:::i;:::-;10326:66;:::i;:::-;10317:75;;10415:6;10408:5;10401:21;10453:4;10446:5;10442:16;10491:3;10482:6;10477:3;10473:16;10470:25;10467:112;;;10498:79;;:::i;:::-;10467:112;10588:54;10635:6;10630:3;10625;10588:54;:::i;:::-;10307:341;10223:425;;;;;:::o;10668:340::-;10724:5;10773:3;10766:4;10758:6;10754:17;10750:27;10740:122;;10781:79;;:::i;:::-;10740:122;10898:6;10885:20;10923:79;10998:3;10990:6;10983:4;10975:6;10971:17;10923:79;:::i;:::-;10914:88;;10730:278;10668:340;;;;:::o;11014:509::-;11083:6;11132:2;11120:9;11111:7;11107:23;11103:32;11100:119;;;11138:79;;:::i;:::-;11100:119;11286:1;11275:9;11271:17;11258:31;11316:18;11308:6;11305:30;11302:117;;;11338:79;;:::i;:::-;11302:117;11443:63;11498:7;11489:6;11478:9;11474:22;11443:63;:::i;:::-;11433:73;;11229:287;11014:509;;;;:::o;11529:468::-;11594:6;11602;11651:2;11639:9;11630:7;11626:23;11622:32;11619:119;;;11657:79;;:::i;:::-;11619:119;11777:1;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11748:117;11904:2;11930:50;11972:7;11963:6;11952:9;11948:22;11930:50;:::i;:::-;11920:60;;11875:115;11529:468;;;;;:::o;12003:307::-;12064:4;12154:18;12146:6;12143:30;12140:56;;;12176:18;;:::i;:::-;12140:56;12214:29;12236:6;12214:29;:::i;:::-;12206:37;;12298:4;12292;12288:15;12280:23;;12003:307;;;:::o;12316:423::-;12393:5;12418:65;12434:48;12475:6;12434:48;:::i;:::-;12418:65;:::i;:::-;12409:74;;12506:6;12499:5;12492:21;12544:4;12537:5;12533:16;12582:3;12573:6;12568:3;12564:16;12561:25;12558:112;;;12589:79;;:::i;:::-;12558:112;12679:54;12726:6;12721:3;12716;12679:54;:::i;:::-;12399:340;12316:423;;;;;:::o;12758:338::-;12813:5;12862:3;12855:4;12847:6;12843:17;12839:27;12829:122;;12870:79;;:::i;:::-;12829:122;12987:6;12974:20;13012:78;13086:3;13078:6;13071:4;13063:6;13059:17;13012:78;:::i;:::-;13003:87;;12819:277;12758:338;;;;:::o;13102:943::-;13197:6;13205;13213;13221;13270:3;13258:9;13249:7;13245:23;13241:33;13238:120;;;13277:79;;:::i;:::-;13238:120;13397:1;13422:53;13467:7;13458:6;13447:9;13443:22;13422:53;:::i;:::-;13412:63;;13368:117;13524:2;13550:53;13595:7;13586:6;13575:9;13571:22;13550:53;:::i;:::-;13540:63;;13495:118;13652:2;13678:53;13723:7;13714:6;13703:9;13699:22;13678:53;:::i;:::-;13668:63;;13623:118;13808:2;13797:9;13793:18;13780:32;13839:18;13831:6;13828:30;13825:117;;;13861:79;;:::i;:::-;13825:117;13966:62;14020:7;14011:6;14000:9;13996:22;13966:62;:::i;:::-;13956:72;;13751:287;13102:943;;;;;;;:::o;14051:797::-;14137:6;14145;14153;14202:2;14190:9;14181:7;14177:23;14173:32;14170:119;;;14208:79;;:::i;:::-;14170:119;14328:1;14353:53;14398:7;14389:6;14378:9;14374:22;14353:53;:::i;:::-;14343:63;;14299:117;14455:2;14481:53;14526:7;14517:6;14506:9;14502:22;14481:53;:::i;:::-;14471:63;;14426:118;14611:2;14600:9;14596:18;14583:32;14642:18;14634:6;14631:30;14628:117;;;14664:79;;:::i;:::-;14628:117;14769:62;14823:7;14814:6;14803:9;14799:22;14769:62;:::i;:::-;14759:72;;14554:287;14051:797;;;;;:::o;14854:652::-;14931:6;14939;14988:2;14976:9;14967:7;14963:23;14959:32;14956:119;;;14994:79;;:::i;:::-;14956:119;15114:1;15139:53;15184:7;15175:6;15164:9;15160:22;15139:53;:::i;:::-;15129:63;;15085:117;15269:2;15258:9;15254:18;15241:32;15300:18;15292:6;15289:30;15286:117;;;15322:79;;:::i;:::-;15286:117;15427:62;15481:7;15472:6;15461:9;15457:22;15427:62;:::i;:::-;15417:72;;15212:287;14854:652;;;;;:::o;15512:474::-;15580:6;15588;15637:2;15625:9;15616:7;15612:23;15608:32;15605:119;;;15643:79;;:::i;:::-;15605:119;15763:1;15788:53;15833:7;15824:6;15813:9;15809:22;15788:53;:::i;:::-;15778:63;;15734:117;15890:2;15916:53;15961:7;15952:6;15941:9;15937:22;15916:53;:::i;:::-;15906:63;;15861:118;15512:474;;;;;:::o;15992:180::-;16040:77;16037:1;16030:88;16137:4;16134:1;16127:15;16161:4;16158:1;16151:15;16178:320;16222:6;16259:1;16253:4;16249:12;16239:22;;16306:1;16300:4;16296:12;16327:18;16317:81;;16383:4;16375:6;16371:17;16361:27;;16317:81;16445:2;16437:6;16434:14;16414:18;16411:38;16408:84;;16464:18;;:::i;:::-;16408:84;16229:269;16178:320;;;:::o;16504:182::-;16644:34;16640:1;16632:6;16628:14;16621:58;16504:182;:::o;16692:366::-;16834:3;16855:67;16919:2;16914:3;16855:67;:::i;:::-;16848:74;;16931:93;17020:3;16931:93;:::i;:::-;17049:2;17044:3;17040:12;17033:19;;16692:366;;;:::o;17064:419::-;17230:4;17268:2;17257:9;17253:18;17245:26;;17317:9;17311:4;17307:20;17303:1;17292:9;17288:17;17281:47;17345:131;17471:4;17345:131;:::i;:::-;17337:139;;17064:419;;;:::o;17489:180::-;17537:77;17534:1;17527:88;17634:4;17631:1;17624:15;17658:4;17655:1;17648:15;17675:191;17715:3;17734:20;17752:1;17734:20;:::i;:::-;17729:25;;17768:20;17786:1;17768:20;:::i;:::-;17763:25;;17811:1;17808;17804:9;17797:16;;17832:3;17829:1;17826:10;17823:36;;;17839:18;;:::i;:::-;17823:36;17675:191;;;;:::o;17872:169::-;18012:21;18008:1;18000:6;17996:14;17989:45;17872:169;:::o;18047:366::-;18189:3;18210:67;18274:2;18269:3;18210:67;:::i;:::-;18203:74;;18286:93;18375:3;18286:93;:::i;:::-;18404:2;18399:3;18395:12;18388:19;;18047:366;;;:::o;18419:419::-;18585:4;18623:2;18612:9;18608:18;18600:26;;18672:9;18666:4;18662:20;18658:1;18647:9;18643:17;18636:47;18700:131;18826:4;18700:131;:::i;:::-;18692:139;;18419:419;;;:::o;18844:180::-;18892:77;18889:1;18882:88;18989:4;18986:1;18979:15;19013:4;19010:1;19003:15;19030:165;19170:17;19166:1;19158:6;19154:14;19147:41;19030:165;:::o;19201:366::-;19343:3;19364:67;19428:2;19423:3;19364:67;:::i;:::-;19357:74;;19440:93;19529:3;19440:93;:::i;:::-;19558:2;19553:3;19549:12;19542:19;;19201:366;;;:::o;19573:419::-;19739:4;19777:2;19766:9;19762:18;19754:26;;19826:9;19820:4;19816:20;19812:1;19801:9;19797:17;19790:47;19854:131;19980:4;19854:131;:::i;:::-;19846:139;;19573:419;;;:::o;19998:233::-;20138:34;20134:1;20126:6;20122:14;20115:58;20207:16;20202:2;20194:6;20190:15;20183:41;19998:233;:::o;20237:366::-;20379:3;20400:67;20464:2;20459:3;20400:67;:::i;:::-;20393:74;;20476:93;20565:3;20476:93;:::i;:::-;20594:2;20589:3;20585:12;20578:19;;20237:366;;;:::o;20609:419::-;20775:4;20813:2;20802:9;20798:18;20790:26;;20862:9;20856:4;20852:20;20848:1;20837:9;20833:17;20826:47;20890:131;21016:4;20890:131;:::i;:::-;20882:139;;20609:419;;;:::o;21034:158::-;21174:10;21170:1;21162:6;21158:14;21151:34;21034:158;:::o;21198:365::-;21340:3;21361:66;21425:1;21420:3;21361:66;:::i;:::-;21354:73;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21198:365;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:410::-;22034:7;22057:20;22075:1;22057:20;:::i;:::-;22052:25;;22091:20;22109:1;22091:20;:::i;:::-;22086:25;;22146:1;22143;22139:9;22168:30;22186:11;22168:30;:::i;:::-;22157:41;;22347:1;22338:7;22334:15;22331:1;22328:22;22308:1;22301:9;22281:83;22258:139;;22377:18;;:::i;:::-;22258:139;22042:362;21994:410;;;;:::o;22410:177::-;22550:29;22546:1;22538:6;22534:14;22527:53;22410:177;:::o;22593:366::-;22735:3;22756:67;22820:2;22815:3;22756:67;:::i;:::-;22749:74;;22832:93;22921:3;22832:93;:::i;:::-;22950:2;22945:3;22941:12;22934:19;;22593:366;;;:::o;22965:419::-;23131:4;23169:2;23158:9;23154:18;23146:26;;23218:9;23212:4;23208:20;23204:1;23193:9;23189:17;23182:47;23246:131;23372:4;23246:131;:::i;:::-;23238:139;;22965:419;;;:::o;23390:141::-;23439:4;23462:3;23454:11;;23485:3;23482:1;23475:14;23519:4;23516:1;23506:18;23498:26;;23390:141;;;:::o;23537:93::-;23574:6;23621:2;23616;23609:5;23605:14;23601:23;23591:33;;23537:93;;;:::o;23636:107::-;23680:8;23730:5;23724:4;23720:16;23699:37;;23636:107;;;;:::o;23749:393::-;23818:6;23868:1;23856:10;23852:18;23891:97;23921:66;23910:9;23891:97;:::i;:::-;24009:39;24039:8;24028:9;24009:39;:::i;:::-;23997:51;;24081:4;24077:9;24070:5;24066:21;24057:30;;24130:4;24120:8;24116:19;24109:5;24106:30;24096:40;;23825:317;;23749:393;;;;;:::o;24148:60::-;24176:3;24197:5;24190:12;;24148:60;;;:::o;24214:142::-;24264:9;24297:53;24315:34;24324:24;24342:5;24324:24;:::i;:::-;24315:34;:::i;:::-;24297:53;:::i;:::-;24284:66;;24214:142;;;:::o;24362:75::-;24405:3;24426:5;24419:12;;24362:75;;;:::o;24443:269::-;24553:39;24584:7;24553:39;:::i;:::-;24614:91;24663:41;24687:16;24663:41;:::i;:::-;24655:6;24648:4;24642:11;24614:91;:::i;:::-;24608:4;24601:105;24519:193;24443:269;;;:::o;24718:73::-;24763:3;24718:73;:::o;24797:189::-;24874:32;;:::i;:::-;24915:65;24973:6;24965;24959:4;24915:65;:::i;:::-;24850:136;24797:189;;:::o;24992:186::-;25052:120;25069:3;25062:5;25059:14;25052:120;;;25123:39;25160:1;25153:5;25123:39;:::i;:::-;25096:1;25089:5;25085:13;25076:22;;25052:120;;;24992:186;;:::o;25184:543::-;25285:2;25280:3;25277:11;25274:446;;;25319:38;25351:5;25319:38;:::i;:::-;25403:29;25421:10;25403:29;:::i;:::-;25393:8;25389:44;25586:2;25574:10;25571:18;25568:49;;;25607:8;25592:23;;25568:49;25630:80;25686:22;25704:3;25686:22;:::i;:::-;25676:8;25672:37;25659:11;25630:80;:::i;:::-;25289:431;;25274:446;25184:543;;;:::o;25733:117::-;25787:8;25837:5;25831:4;25827:16;25806:37;;25733:117;;;;:::o;25856:169::-;25900:6;25933:51;25981:1;25977:6;25969:5;25966:1;25962:13;25933:51;:::i;:::-;25929:56;26014:4;26008;26004:15;25994:25;;25907:118;25856:169;;;;:::o;26030:295::-;26106:4;26252:29;26277:3;26271:4;26252:29;:::i;:::-;26244:37;;26314:3;26311:1;26307:11;26301:4;26298:21;26290:29;;26030:295;;;;:::o;26330:1395::-;26447:37;26480:3;26447:37;:::i;:::-;26549:18;26541:6;26538:30;26535:56;;;26571:18;;:::i;:::-;26535:56;26615:38;26647:4;26641:11;26615:38;:::i;:::-;26700:67;26760:6;26752;26746:4;26700:67;:::i;:::-;26794:1;26818:4;26805:17;;26850:2;26842:6;26839:14;26867:1;26862:618;;;;27524:1;27541:6;27538:77;;;27590:9;27585:3;27581:19;27575:26;27566:35;;27538:77;27641:67;27701:6;27694:5;27641:67;:::i;:::-;27635:4;27628:81;27497:222;26832:887;;26862:618;26914:4;26910:9;26902:6;26898:22;26948:37;26980:4;26948:37;:::i;:::-;27007:1;27021:208;27035:7;27032:1;27029:14;27021:208;;;27114:9;27109:3;27105:19;27099:26;27091:6;27084:42;27165:1;27157:6;27153:14;27143:24;;27212:2;27201:9;27197:18;27184:31;;27058:4;27055:1;27051:12;27046:17;;27021:208;;;27257:6;27248:7;27245:19;27242:179;;;27315:9;27310:3;27306:19;27300:26;27358:48;27400:4;27392:6;27388:17;27377:9;27358:48;:::i;:::-;27350:6;27343:64;27265:156;27242:179;27467:1;27463;27455:6;27451:14;27447:22;27441:4;27434:36;26869:611;;;26832:887;;26422:1303;;;26330:1395;;:::o;27731:172::-;27871:24;27867:1;27859:6;27855:14;27848:48;27731:172;:::o;27909:366::-;28051:3;28072:67;28136:2;28131:3;28072:67;:::i;:::-;28065:74;;28148:93;28237:3;28148:93;:::i;:::-;28266:2;28261:3;28257:12;28250:19;;27909:366;;;:::o;28281:419::-;28447:4;28485:2;28474:9;28470:18;28462:26;;28534:9;28528:4;28524:20;28520:1;28509:9;28505:17;28498:47;28562:131;28688:4;28562:131;:::i;:::-;28554:139;;28281:419;;;:::o;28706:174::-;28846:26;28842:1;28834:6;28830:14;28823:50;28706:174;:::o;28886:366::-;29028:3;29049:67;29113:2;29108:3;29049:67;:::i;:::-;29042:74;;29125:93;29214:3;29125:93;:::i;:::-;29243:2;29238:3;29234:12;29227:19;;28886:366;;;:::o;29258:419::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:177::-;29823:29;29819:1;29811:6;29807:14;29800:53;29683:177;:::o;29866:366::-;30008:3;30029:67;30093:2;30088:3;30029:67;:::i;:::-;30022:74;;30105:93;30194:3;30105:93;:::i;:::-;30223:2;30218:3;30214:12;30207:19;;29866:366;;;:::o;30238:419::-;30404:4;30442:2;30431:9;30427:18;30419:26;;30491:9;30485:4;30481:20;30477:1;30466:9;30462:17;30455:47;30519:131;30645:4;30519:131;:::i;:::-;30511:139;;30238:419;;;:::o;30663:148::-;30765:11;30802:3;30787:18;;30663:148;;;;:::o;30817:390::-;30923:3;30951:39;30984:5;30951:39;:::i;:::-;31006:89;31088:6;31083:3;31006:89;:::i;:::-;30999:96;;31104:65;31162:6;31157:3;31150:4;31143:5;31139:16;31104:65;:::i;:::-;31194:6;31189:3;31185:16;31178:23;;30927:280;30817:390;;;;:::o;31213:435::-;31393:3;31415:95;31506:3;31497:6;31415:95;:::i;:::-;31408:102;;31527:95;31618:3;31609:6;31527:95;:::i;:::-;31520:102;;31639:3;31632:10;;31213:435;;;;;:::o;31654:164::-;31794:16;31790:1;31782:6;31778:14;31771:40;31654:164;:::o;31824:366::-;31966:3;31987:67;32051:2;32046:3;31987:67;:::i;:::-;31980:74;;32063:93;32152:3;32063:93;:::i;:::-;32181:2;32176:3;32172:12;32165:19;;31824:366;;;:::o;32196:419::-;32362:4;32400:2;32389:9;32385:18;32377:26;;32449:9;32443:4;32439:20;32435:1;32424:9;32420:17;32413:47;32477:131;32603:4;32477:131;:::i;:::-;32469:139;;32196:419;;;:::o;32621:225::-;32761:34;32757:1;32749:6;32745:14;32738:58;32830:8;32825:2;32817:6;32813:15;32806:33;32621:225;:::o;32852:366::-;32994:3;33015:67;33079:2;33074:3;33015:67;:::i;:::-;33008:74;;33091:93;33180:3;33091:93;:::i;:::-;33209:2;33204:3;33200:12;33193:19;;32852:366;;;:::o;33224:419::-;33390:4;33428:2;33417:9;33413:18;33405:26;;33477:9;33471:4;33467:20;33463:1;33452:9;33448:17;33441:47;33505:131;33631:4;33505:131;:::i;:::-;33497:139;;33224:419;;;:::o;33649:98::-;33700:6;33734:5;33728:12;33718:22;;33649:98;;;:::o;33753:168::-;33836:11;33870:6;33865:3;33858:19;33910:4;33905:3;33901:14;33886:29;;33753:168;;;;:::o;33927:373::-;34013:3;34041:38;34073:5;34041:38;:::i;:::-;34095:70;34158:6;34153:3;34095:70;:::i;:::-;34088:77;;34174:65;34232:6;34227:3;34220:4;34213:5;34209:16;34174:65;:::i;:::-;34264:29;34286:6;34264:29;:::i;:::-;34259:3;34255:39;34248:46;;34017:283;33927:373;;;;:::o;34306:640::-;34501:4;34539:3;34528:9;34524:19;34516:27;;34553:71;34621:1;34610:9;34606:17;34597:6;34553:71;:::i;:::-;34634:72;34702:2;34691:9;34687:18;34678:6;34634:72;:::i;:::-;34716;34784:2;34773:9;34769:18;34760:6;34716:72;:::i;:::-;34835:9;34829:4;34825:20;34820:2;34809:9;34805:18;34798:48;34863:76;34934:4;34925:6;34863:76;:::i;:::-;34855:84;;34306:640;;;;;;;:::o;34952:141::-;35008:5;35039:6;35033:13;35024:22;;35055:32;35081:5;35055:32;:::i;:::-;34952:141;;;;:::o;35099:349::-;35168:6;35217:2;35205:9;35196:7;35192:23;35188:32;35185:119;;;35223:79;;:::i;:::-;35185:119;35343:1;35368:63;35423:7;35414:6;35403:9;35399:22;35368:63;:::i;:::-;35358:73;;35314:127;35099:349;;;;:::o;35454:233::-;35493:3;35516:24;35534:5;35516:24;:::i;:::-;35507:33;;35562:66;35555:5;35552:77;35549:103;;35632:18;;:::i;:::-;35549:103;35679:1;35672:5;35668:13;35661:20;;35454:233;;;:::o;35693:180::-;35741:77;35738:1;35731:88;35838:4;35835:1;35828:15;35862:4;35859:1;35852:15;35879:185;35919:1;35936:20;35954:1;35936:20;:::i;:::-;35931:25;;35970:20;35988:1;35970:20;:::i;:::-;35965:25;;36009:1;35999:35;;36014:18;;:::i;:::-;35999:35;36056:1;36053;36049:9;36044:14;;35879:185;;;;:::o;36070:194::-;36110:4;36130:20;36148:1;36130:20;:::i;:::-;36125:25;;36164:20;36182:1;36164:20;:::i;:::-;36159:25;;36208:1;36205;36201:9;36193:17;;36232:1;36226:4;36223:11;36220:37;;;36237:18;;:::i;:::-;36220:37;36070:194;;;;:::o;36270:176::-;36302:1;36319:20;36337:1;36319:20;:::i;:::-;36314:25;;36353:20;36371:1;36353:20;:::i;:::-;36348:25;;36392:1;36382:35;;36397:18;;:::i;:::-;36382:35;36438:1;36435;36431:9;36426:14;;36270:176;;;;:::o;36452:77::-;36489:7;36518:5;36507:16;;36452:77;;;:::o;36535:118::-;36622:24;36640:5;36622:24;:::i;:::-;36617:3;36610:37;36535:118;;:::o;36659:332::-;36780:4;36818:2;36807:9;36803:18;36795:26;;36831:71;36899:1;36888:9;36884:17;36875:6;36831:71;:::i;:::-;36912:72;36980:2;36969:9;36965:18;36956:6;36912:72;:::i;:::-;36659:332;;;;;:::o;36997:180::-;37045:77;37042:1;37035:88;37142:4;37139:1;37132:15;37166:4;37163:1;37156:15;37183:174;37323:26;37319:1;37311:6;37307:14;37300:50;37183:174;:::o;37363:366::-;37505:3;37526:67;37590:2;37585:3;37526:67;:::i;:::-;37519:74;;37602:93;37691:3;37602:93;:::i;:::-;37720:2;37715:3;37711:12;37704:19;;37363:366;;;:::o;37735:419::-;37901:4;37939:2;37928:9;37924:18;37916:26;;37988:9;37982:4;37978:20;37974:1;37963:9;37959:17;37952:47;38016:131;38142:4;38016:131;:::i;:::-;38008:139;;37735:419;;;:::o;38160:181::-;38300:33;38296:1;38288:6;38284:14;38277:57;38160:181;:::o;38347:366::-;38489:3;38510:67;38574:2;38569:3;38510:67;:::i;:::-;38503:74;;38586:93;38675:3;38586:93;:::i;:::-;38704:2;38699:3;38695:12;38688:19;;38347:366;;;:::o;38719:419::-;38885:4;38923:2;38912:9;38908:18;38900:26;;38972:9;38966:4;38962:20;38958:1;38947:9;38943:17;38936:47;39000:131;39126:4;39000:131;:::i;:::-;38992:139;;38719:419;;;:::o;39144:221::-;39284:34;39280:1;39272:6;39268:14;39261:58;39353:4;39348:2;39340:6;39336:15;39329:29;39144:221;:::o;39371:366::-;39513:3;39534:67;39598:2;39593:3;39534:67;:::i;:::-;39527:74;;39610:93;39699:3;39610:93;:::i;:::-;39728:2;39723:3;39719:12;39712:19;;39371:366;;;:::o;39743:419::-;39909:4;39947:2;39936:9;39932:18;39924:26;;39996:9;39990:4;39986:20;39982:1;39971:9;39967:17;39960:47;40024:131;40150:4;40024:131;:::i;:::-;40016:139;;39743:419;;;:::o;40168:221::-;40308:34;40304:1;40296:6;40292:14;40285:58;40377:4;40372:2;40364:6;40360:15;40353:29;40168:221;:::o;40395:366::-;40537:3;40558:67;40622:2;40617:3;40558:67;:::i;:::-;40551:74;;40634:93;40723:3;40634:93;:::i;:::-;40752:2;40747:3;40743:12;40736:19;;40395:366;;;:::o;40767:419::-;40933:4;40971:2;40960:9;40956:18;40948:26;;41020:9;41014:4;41010:20;41006:1;40995:9;40991:17;40984:47;41048:131;41174:4;41048:131;:::i;:::-;41040:139;;40767:419;;;:::o;41192:214::-;41332:66;41328:1;41320:6;41316:14;41309:90;41192:214;:::o;41412:400::-;41572:3;41593:84;41675:1;41670:3;41593:84;:::i;:::-;41586:91;;41686:93;41775:3;41686:93;:::i;:::-;41804:1;41799:3;41795:11;41788:18;;41412:400;;;:::o;41818:79::-;41857:7;41886:5;41875:16;;41818:79;;;:::o;41903:157::-;42008:45;42028:24;42046:5;42028:24;:::i;:::-;42008:45;:::i;:::-;42003:3;41996:58;41903:157;;:::o;42066:663::-;42307:3;42329:148;42473:3;42329:148;:::i;:::-;42322:155;;42487:75;42558:3;42549:6;42487:75;:::i;:::-;42587:2;42582:3;42578:12;42571:19;;42600:75;42671:3;42662:6;42600:75;:::i;:::-;42700:2;42695:3;42691:12;42684:19;;42720:3;42713:10;;42066:663;;;;;:::o;42735:86::-;42770:7;42810:4;42803:5;42799:16;42788:27;;42735:86;;;:::o;42827:112::-;42910:22;42926:5;42910:22;:::i;:::-;42905:3;42898:35;42827:112;;:::o;42945:545::-;43118:4;43156:3;43145:9;43141:19;43133:27;;43170:71;43238:1;43227:9;43223:17;43214:6;43170:71;:::i;:::-;43251:68;43315:2;43304:9;43300:18;43291:6;43251:68;:::i;:::-;43329:72;43397:2;43386:9;43382:18;43373:6;43329:72;:::i;:::-;43411;43479:2;43468:9;43464:18;43455:6;43411:72;:::i;:::-;42945:545;;;;;;;:::o;43496:664::-;43701:4;43739:3;43728:9;43724:19;43716:27;;43753:71;43821:1;43810:9;43806:17;43797:6;43753:71;:::i;:::-;43834:72;43902:2;43891:9;43887:18;43878:6;43834:72;:::i;:::-;43916;43984:2;43973:9;43969:18;43960:6;43916:72;:::i;:::-;43998;44066:2;44055:9;44051:18;44042:6;43998:72;:::i;:::-;44080:73;44148:3;44137:9;44133:19;44124:6;44080:73;:::i;:::-;43496:664;;;;;;;;:::o
Swarm Source
ipfs://9f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa89
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.