ERC-721
NFT
Overview
Max Total Supply
508 Dialoger
Holders
163
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DialogerLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Dialoger
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-12 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.11; pragma experimental ABIEncoderV2; /* * @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 GSN 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; } } interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } /** * @title 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); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address Serial */ 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 * Serials 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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); } } 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(); 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; // Base URI string private _baseURI; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { 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 (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "token not exist"); 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 _baseURI; } /** * @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 (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); 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 contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } abstract contract OwnerCheck is Ownable { mapping(address => bool) public operatorMap; uint8 private unlocked = 1; event SetOperator(address addr, bool auth); modifier onlyOperator() { require(isOperator(msg.sender), "caller is not the operator"); _; } modifier lock() { require(unlocked == 1, 'Contract: LOCKED'); unlocked = 0; _; unlocked = 1; } function setOperator(address addr, bool auth) public onlyOwner { operatorMap[addr] = auth; emit SetOperator(addr, auth); } function isOperator(address addr) public view returns (bool) { return operatorMap[addr]; } } interface IERC20 { function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) {// Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } interface IProps is IERC721 { function currentIndex() external view returns (uint256); function mint(address to, uint256 count) external; } contract Dialoger is ERC721A, OwnerCheck { using SafeMath for uint256; using Strings for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.UintSet; //pack to one slot bool public publicSales = false; address public signer = 0xB82Dda08bFcE8C51F1e37ebE9bc8D7d4Bc0547Ba; address payable public ethBeneficiary = payable(0xB50bFA113D7A6B44c1857866e06F0B5483D7B92e); address public metaBeneficiary = 0x2848562b3fabA0C03A24a0369ce19D6B69fEbBAb; uint8 public preSaleCountOnce = 3; uint8 public publicSaleCountOnce = 10; uint16 public maxCount = 10000; uint32 public REVEAL_TIMESTAMP; IERC20 public metaToken = IERC20(0x364fcd7325C035CC4F2cdE8b6c8D7Df5e7Db6589); IProps public props; uint32 public hour48 = 60 * 60 * 48; string public PROVENANCE; uint256 public price = 0.35e18; //card id include dialoger and props,dialoger cardId 1-10000,props cardId>=20000 mapping(address => EnumerableSet.UintSet) private lockCardIds; mapping(uint256 => uint256) public lockTime; mapping(address => uint256) public alreadyMinted; mapping(address => uint256) public nonce; event PublicSale(address user, uint256 start, uint8 count); event PreSale(address user, uint256 start, uint256 count); event MintProps(address user, uint256 cardId, uint256 pay, uint32[] depositCardIds, uint32[] existCardIds); event LockCard(address user, uint32[] cardIds); event UnlockCard(address user, uint32[] cardIds); constructor(string memory _name, string memory _symbol) ERC721A(_name, _symbol) { _setBaseURI("https://storage.googleapis.com/"); } function mintProps(uint32[] calldata depositCardIds, uint32[] calldata existCardIds, bytes32 r, bytes32 s, uint8 v, uint256 mintPrice) external lock { uint8 count = uint8(depositCardIds.length + existCardIds.length); address sender = msg.sender; require(signer == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, block.chainid, address(this), count, mintPrice, nonce[sender])))), v, r, s), "sign"); nonce[sender]++; //transfer dialoger and props card here first lockCardIn(sender, depositCardIds); checkCard(sender, existCardIds); metaToken.safeTransferFrom(sender, metaBeneficiary, mintPrice); uint256 cardId = props.currentIndex(); props.mint(sender, count); emit MintProps(sender, cardId, mintPrice, depositCardIds, existCardIds); } function checkCard(address sender, uint32[] calldata cardIds) private { for (uint i = 0; i < cardIds.length; i++) { uint256 card = uint256(cardIds[i]); require(lockCardIds[sender].contains(card), "not own"); require((lockTime[card] + hour48) < uint32(block.timestamp), "cannot use"); lockTime[card] = uint32(block.timestamp); } } function lockCardIn(address sender, uint32[] calldata cardIds) private { for (uint256 i = 0; i < cardIds.length; i++) { uint256 cardId = uint256(cardIds[i]); if (cardId < _currentIndex) { safeTransferFrom(sender, address(this), cardId); } else { props.safeTransferFrom(sender, address(this), cardId); } lockCardIds[sender].add(cardId); lockTime[cardId] = block.timestamp; } } function unlockCard(uint32[] calldata cardIds) public lock { address sender = msg.sender; for (uint i = 0; i < cardIds.length; i++) { uint256 cardId = uint256(cardIds[i]); require(lockCardIds[sender].contains(cardId), "not contain this card"); require(lockTime[cardId] + hour48 < block.timestamp, "cannot unlock"); require(lockCardIds[sender].remove(cardId), "remove false"); delete lockTime[cardId]; if (cardId < _currentIndex) { this.safeTransferFrom(address(this), sender, cardId); } else { props.safeTransferFrom(address(this), sender, cardId); } } emit UnlockCard(sender, cardIds); } function preSale(bytes32 r, bytes32 s, uint8 v, uint8 count) external payable lock { require(!publicSales && (totalSupply() <= maxCount), "not started or stopped"); address sender = msg.sender; require(uint8(alreadyMinted[sender]) + count <= preSaleCountOnce, 'minted'); require(signer == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, block.chainid, address(this), count)))), v, r, s), "sign"); alreadyMinted[sender] += uint256(count); uint256 needPay = price * count; require(needPay == msg.value, 'eth wrong'); ethBeneficiary.transfer(needPay); uint256 cardId = totalSupply() + 1; _mint(sender, count, new bytes(0), false); emit PreSale(sender, cardId, count); } function publicSale(uint8 count) external payable lock { require(publicSales && (totalSupply() <= maxCount), "not start or sold out"); address sender = msg.sender; uint256 cardId = totalSupply() + 1; require(count <= publicSaleCountOnce, "too much"); uint256 needPay = price * count; require(needPay == msg.value, 'eth wrong'); ethBeneficiary.transfer(needPay); _mint(sender, count, new bytes(0), false); emit PublicSale(sender, cardId, count); } function mint(address to, uint256 count) external onlyOperator { _mint(to, count, new bytes(0), false); } function setBaseTokenURI(string memory baseTokenURI) external onlyOperator { _setBaseURI(baseTokenURI); } function getBaseURI() public view returns (string memory){ return baseURI(); } function getLockCardLength(address user) public view returns (uint){ return lockCardIds[user].length(); } function getLockCardId(address user, uint cardIndex) public view returns (uint){ return lockCardIds[user].at(cardIndex); } function getLockCard(address user) public view returns (uint[] memory ret){ uint len = lockCardIds[user].length(); ret = new uint[](len); for (uint i = 0; i < len; i++) { ret[i] = lockCardIds[user].at(i); } } function getCanUsed(address user) public view returns (uint[] memory ret){ uint len = lockCardIds[user].length(); uint[] memory temp = new uint[](len); uint count; for (uint i = 0; i < len; i++) { uint card = lockCardIds[user].at(i); if (lockTime[card] + hour48 < block.timestamp) { temp[i] = card; count++; } } ret = new uint[](count); uint j = 0; for (uint i = 0; i < len; i++) { if (temp[i] > 0) { ret[j] = temp[i]; j++; } } } function setPrice(uint256 _price) external onlyOperator { price = _price; } function setBeneficiary(address payable _ethBeneficiary, address _metaBeneficiary) external onlyOperator { ethBeneficiary = _ethBeneficiary; metaBeneficiary = _metaBeneficiary; } function setSigner(address _signer) external onlyOperator { signer = _signer; } function setPublicSales(bool _publicSales) external onlyOperator { publicSales = _publicSales; } function setPreSaleCountOnce(uint8 _preSaleCountOnce) external onlyOperator { preSaleCountOnce = _preSaleCountOnce; } function setPublicSaleCountOnce(uint8 _publicSaleCountOnce) external onlyOperator { publicSaleCountOnce = _publicSaleCountOnce; } function setMaxCount(uint16 _maxCount) external onlyOperator { maxCount = _maxCount; } function setProps(IProps _props) external onlyOperator { props = _props; } function setMetaToken(IERC20 _metaToken) external onlyOperator { metaToken = _metaToken; } function setHour48(uint32 _hour48) external onlyOperator { hour48 = _hour48; } function onERC721Received( address, address, uint256, bytes memory ) public pure returns (bytes4) { return this.onERC721Received.selector; } function setRevealTimestamp(uint32 revealTimeStamp) public onlyOperator { REVEAL_TIMESTAMP = revealTimeStamp; } function setProvenanceHash(string memory provenanceHash) public onlyOperator { PROVENANCE = provenanceHash; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint32[]","name":"cardIds","type":"uint32[]"}],"name":"LockCard","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pay","type":"uint256"},{"indexed":false,"internalType":"uint32[]","name":"depositCardIds","type":"uint32[]"},{"indexed":false,"internalType":"uint32[]","name":"existCardIds","type":"uint32[]"}],"name":"MintProps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"PreSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"count","type":"uint8"}],"name":"PublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"auth","type":"bool"}],"name":"SetOperator","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint32[]","name":"cardIds","type":"uint32[]"}],"name":"UnlockCard","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethBeneficiary","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCanUsed","outputs":[{"internalType":"uint256[]","name":"ret","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLockCard","outputs":[{"internalType":"uint256[]","name":"ret","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"cardIndex","type":"uint256"}],"name":"getLockCardId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLockCardLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hour48","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"depositCardIds","type":"uint32[]"},{"internalType":"uint32[]","name":"existCardIds","type":"uint32[]"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"mintProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"uint8","name":"count","type":"uint8"}],"name":"preSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleCountOnce","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"props","outputs":[{"internalType":"contract IProps","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleCountOnce","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ethBeneficiary","type":"address"},{"internalType":"address","name":"_metaBeneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_hour48","type":"uint32"}],"name":"setHour48","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxCount","type":"uint16"}],"name":"setMaxCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_metaToken","type":"address"}],"name":"setMetaToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"auth","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_preSaleCountOnce","type":"uint8"}],"name":"setPreSaleCountOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IProps","name":"_props","type":"address"}],"name":"setProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_publicSaleCountOnce","type":"uint8"}],"name":"setPublicSaleCountOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSales","type":"bool"}],"name":"setPublicSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"revealTimeStamp","type":"uint32"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"cardIds","type":"uint32[]"}],"name":"unlockCard","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600c80546001600160b01b03191675b82dda08bfce8c51f1e37ebe9bc8d7d4bc0547ba0001179055600d805473b50bfa113d7a6b44c1857866e06f0b5483d7b92e6001600160a01b031991821617909155600e80546001600160c01b0319167727100a032848562b3faba0c03a24a0369ce19d6b69febbab179055600f805473364fcd7325c035cc4f2cde8b6c8d7df5e7db658992169190911790556010805463ffffffff60a01b19166102a360a81b1790556704db732547630000601255348015620000d057600080fd5b506040516200418438038062004184833981016040819052620000f391620003d3565b8181620001076301ffc9a760e01b620001c3565b81516200011c90600390602085019062000260565b5080516200013290600490602084019062000260565b50506001805550600a80546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152601f81527f68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f006020820152620001bb9062000247565b50506200047a565b6001600160e01b03198082161415620002225760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200025c90600990602084019062000260565b5050565b8280546200026e906200043d565b90600052602060002090601f016020900481019282620002925760008555620002dd565b82601f10620002ad57805160ff1916838001178555620002dd565b82800160010185558215620002dd579182015b82811115620002dd578251825591602001919060010190620002c0565b50620002eb929150620002ef565b5090565b5b80821115620002eb5760008155600101620002f0565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200032e57600080fd5b81516001600160401b03808211156200034b576200034b62000306565b604051601f8301601f19908116603f0116810190828211818310171562000376576200037662000306565b816040528381526020925086838588010111156200039357600080fd5b600091505b83821015620003b7578582018301518183018401529082019062000398565b83821115620003c95760008385830101525b9695505050505050565b60008060408385031215620003e757600080fd5b82516001600160401b0380821115620003ff57600080fd5b6200040d868387016200031c565b935060208501519150808211156200042457600080fd5b5062000433858286016200031c565b9150509250929050565b600181811c908216806200045257607f821691505b602082108114156200047457634e487b7160e01b600052602260045260246000fd5b50919050565b613cfa806200048a6000396000f3fe6080604052600436106103975760003560e01c80636373a6b1116101dc578063977e862e11610102578063c4eaca34116100a0578063e8b23f661161006f578063e8b23f6614610b19578063e985e9c514610b46578063f2fde38b14610b8f578063f52564ec14610baf57600080fd5b8063c4eaca3414610a98578063c87b56dd14610ab9578063d7cb529614610ad9578063e0bec26d14610af957600080fd5b8063a22cb465116100dc578063a22cb46514610a15578063a80a940014610a35578063b561f16014610a48578063b88d4fde14610a7857600080fd5b8063977e862e146109aa5780639ef2d87a146109ca578063a035b1fe146109ff57600080fd5b8063714c53981161017a5780638da5cb5b116101495780638da5cb5b1461093757806391b7f5ed146109555780639499a6cc1461097557806395d89b411461099557600080fd5b8063714c5398146108cd578063715018a6146108e25780637af43144146108f7578063856e136a1461091757600080fd5b80636d40228f116101b65780636d40228f146108405780636d70f7ae1461086057806370a082311461088057806370ae92d2146108a057600080fd5b80636373a6b1146107eb57806366fb5fb9146108005780636c19e7831461082057600080fd5b80631bcc80ac116102c157806330176e131161025f5780634c3ec07b1161022e5780634c3ec07b1461076b5780634cfe72e61461078b578063558a7297146107ab5780636352211e146107cb57600080fd5b806330176e13146106d857806340c10f19146106f857806342842e0e1461071857806347a7cf401461073857600080fd5b8063238ac9331161029b578063238ac9331461065257806323b872dd1461067857806327517649146106985780632bcf8f47146106b857600080fd5b80631bcc80ac146105ff5780632060a1501461061257806323190fa91461063257600080fd5b806310aa006d1161033957806318160ddd1161030857806318160ddd1461058757806318e20a381461059c57806319cfca94146105c05780631a23cda3146105e057600080fd5b806310aa006d146104e1578063150b7a0214610501578063151c9ba41461053a57806316bcac151461056757600080fd5b8063095ea7b311610375578063095ea7b31461042b57806309bcdeca1461044d5780630a398b881461048657806310969523146104c157600080fd5b806301ffc9a71461039c57806306fdde03146103d1578063081812fc146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046133cc565b610bcf565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103e6610c2a565b6040516103c89190613441565b3480156103ff57600080fd5b5061041361040e366004613454565b610cbc565b6040516001600160a01b0390911681526020016103c8565b34801561043757600080fd5b5061044b610446366004613482565b610d00565b005b34801561045957600080fd5b5060105461047190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016103c8565b34801561049257600080fd5b506104b36104a13660046134ae565b60156020526000908152604090205481565b6040519081526020016103c8565b3480156104cd57600080fd5b5061044b6104dc366004613556565b610d8e565b3480156104ed57600080fd5b5061044b6104fc3660046135e9565b610dd3565b34801561050d57600080fd5b5061052161051c36600461362a565b6110ae565b6040516001600160e01b031990911681526020016103c8565b34801561054657600080fd5b5061055a6105553660046134ae565b6110bf565b6040516103c891906136a9565b34801561057357600080fd5b5061044b610582366004613706565b61118d565b34801561059357600080fd5b506104b36111d8565b3480156105a857600080fd5b50600e5461047190600160c01b900463ffffffff1681565b3480156105cc57600080fd5b50600f54610413906001600160a01b031681565b3480156105ec57600080fd5b50600c546103bc90610100900460ff1681565b61044b61060d366004613732565b6111e6565b34801561061e57600080fd5b50601054610413906001600160a01b031681565b34801561063e57600080fd5b5061044b61064d36600461374d565b61140d565b34801561065e57600080fd5b50600c54610413906201000090046001600160a01b031681565b34801561068457600080fd5b5061044b610693366004613771565b611454565b3480156106a457600080fd5b5061044b6106b33660046137b2565b61145f565b3480156106c457600080fd5b506104b36106d3366004613482565b61179d565b3480156106e457600080fd5b5061044b6106f3366004613556565b6117c6565b34801561070457600080fd5b5061044b610713366004613482565b6117f7565b34801561072457600080fd5b5061044b610733366004613771565b611828565b34801561074457600080fd5b50600e5461075990600160a01b900460ff1681565b60405160ff90911681526020016103c8565b34801561077757600080fd5b5061044b610786366004613732565b611843565b34801561079757600080fd5b50600d54610413906001600160a01b031681565b3480156107b757600080fd5b5061044b6107c636600461385b565b611888565b3480156107d757600080fd5b506104136107e6366004613454565b611915565b3480156107f757600080fd5b506103e661196e565b34801561080c57600080fd5b506104b361081b3660046134ae565b6119fc565b34801561082c57600080fd5b5061044b61083b3660046134ae565b611a1d565b34801561084c57600080fd5b5061055a61085b3660046134ae565b611a6c565b34801561086c57600080fd5b506103bc61087b3660046134ae565b611c4e565b34801561088c57600080fd5b506104b361089b3660046134ae565b611c6c565b3480156108ac57600080fd5b506104b36108bb3660046134ae565b60166020526000908152604090205481565b3480156108d957600080fd5b506103e6611cba565b3480156108ee57600080fd5b5061044b611cc9565b34801561090357600080fd5b5061044b6109123660046134ae565b611d3d565b34801561092357600080fd5b5061044b610932366004613894565b611d84565b34801561094357600080fd5b50600a546001600160a01b0316610413565b34801561096157600080fd5b5061044b610970366004613454565b611dc3565b34801561098157600080fd5b5061044b6109903660046134ae565b611ded565b3480156109a157600080fd5b506103e6611e34565b3480156109b657600080fd5b50600e54610413906001600160a01b031681565b3480156109d657600080fd5b50600e546109ec90600160b01b900461ffff1681565b60405161ffff90911681526020016103c8565b348015610a0b57600080fd5b506104b360125481565b348015610a2157600080fd5b5061044b610a3036600461385b565b611e43565b61044b610a433660046138b1565b611ed9565b348015610a5457600080fd5b506103bc610a633660046134ae565b600b6020526000908152604090205460ff1681565b348015610a8457600080fd5b5061044b610a9336600461362a565b612265565b348015610aa457600080fd5b50600e5461075990600160a81b900460ff1681565b348015610ac557600080fd5b506103e6610ad4366004613454565b6122b6565b348015610ae557600080fd5b5061044b610af4366004613732565b61233a565b348015610b0557600080fd5b5061044b610b14366004613706565b61237f565b348015610b2557600080fd5b506104b3610b34366004613454565b60146020526000908152604090205481565b348015610b5257600080fd5b506103bc610b613660046138f7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9b57600080fd5b5061044b610baa3660046134ae565b6123ca565b348015610bbb57600080fd5b5061044b610bca3660046138f7565b6124b5565b60006001600160e01b031982166380ac58cd60e01b1480610c0057506001600160e01b03198216635b5e139f60e01b145b80610c2457506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b606060038054610c3990613925565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6590613925565b8015610cb25780601f10610c8757610100808354040283529160200191610cb2565b820191906000526020600020905b815481529060010190602001808311610c9557829003601f168201915b5050505050905090565b6000610cc782612508565b610ce4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610d0b82611915565b9050806001600160a01b0316836001600160a01b03161415610d405760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d605750610d5e8133610b61565b155b15610d7e576040516367d9dca160e11b815260040160405180910390fd5b610d89838383612541565b505050565b610d9733611c4e565b610dbc5760405162461bcd60e51b8152600401610db390613960565b60405180910390fd5b8051610dcf90601190602084019061331d565b5050565b600c5460ff16600114610df85760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690553360005b82811015611060576000848483818110610e2257610e226139c1565b9050602002016020810190610e379190613706565b6001600160a01b038416600090815260136020526040902063ffffffff9182169250610e6591839061259d16565b610ea95760405162461bcd60e51b81526020600482015260156024820152741b9bdd0818dbdb9d185a5b881d1a1a5cc818d85c99605a1b6044820152606401610db3565b6010546000828152601460205260409020544291610ed591600160a01b90910463ffffffff16906139ed565b10610f125760405162461bcd60e51b815260206004820152600d60248201526c63616e6e6f7420756e6c6f636b60981b6044820152606401610db3565b6001600160a01b0383166000908152601360205260409020610f3490826125b5565b610f6f5760405162461bcd60e51b815260206004820152600c60248201526b72656d6f76652066616c736560a01b6044820152606401610db3565b600081815260146020526040812055600154811015610fe657604051632142170760e11b815230906342842e0e90610faf90839087908690600401613a05565b600060405180830381600087803b158015610fc957600080fd5b505af1158015610fdd573d6000803e3d6000fd5b5050505061104d565b601054604051632142170760e11b81526001600160a01b03909116906342842e0e9061101a90309087908690600401613a05565b600060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050505b508061105881613a29565b915050610e06565b507f110a8a977ad904fb51dc3a5466b050a7f37736b638edbbe9c9f3f8faeb2b5f9281848460405161109493929190613a88565b60405180910390a15050600c805460ff1916600117905550565b630a85bd0160e11b5b949350505050565b6001600160a01b0381166000908152601360205260408120606091906110e4906125c1565b9050806001600160401b038111156110fe576110fe6134cb565b604051908082528060200260200182016040528015611127578160200160208202803683370190505b50915060005b81811015611186576001600160a01b038416600090815260136020526040902061115790826125cb565b838281518110611169576111696139c1565b60209081029190910101528061117e81613a29565b91505061112d565b5050919050565b61119633611c4e565b6111b25760405162461bcd60e51b8152600401610db390613960565b600e805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600254600154036000190190565b600c5460ff1660011461120b5760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690819055610100900460ff16801561123f5750600e54600160b01b900461ffff1661123c6111d8565b11155b6112835760405162461bcd60e51b81526020600482015260156024820152741b9bdd081cdd185c9d081bdc881cdbdb19081bdd5d605a1b6044820152606401610db3565b33600061128e6111d8565b6112999060016139ed565b600e5490915060ff600160a81b909104811690841611156112e75760405162461bcd60e51b81526020600482015260086024820152670e8dede40daeac6d60c31b6044820152606401610db3565b60008360ff166012546112fa9190613ab6565b90503481146113375760405162461bcd60e51b81526020600482015260096024820152686574682077726f6e6760b81b6044820152606401610db3565b600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611371573d6000803e3d6000fd5b506113af8360ff861660005b6040519080825280601f01601f1916602001820160405280156113a7576020820181803683370190505b5060006125d7565b604080516001600160a01b03851681526020810184905260ff86168183015290517f17420eb78e67e3358d3212569823e24596995765bc7ed48b88ba7b9f4e7eceac9181900360600190a15050600c805460ff191660011790555050565b61141633611c4e565b6114325760405162461bcd60e51b8152600401610db390613960565b600e805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b610d898383836127aa565b600c5460ff166001146114845760405162461bcd60e51b8152600401610db390613997565b600c805460ff19169055600061149a86896139ed565b336000818152601660209081526040918290205491516bffffffffffffffffffffffff19606085811b8216938301939093524660348301523090921b90911660548201526001600160f81b031960f885901b1660688201526069810186905260898101919091529192509060019060a90160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018890526080810187905260a0016020604051602081039080840390855afa1580156115b2573d6000803e3d6000fd5b5050604051601f190151600c546201000090046001600160a01b03908116911614905061160a5760405162461bcd60e51b8152600401610db39060208082526004908201526339b4b3b760e11b604082015260600190565b6001600160a01b038116600090815260166020526040812080549161162e83613a29565b919050555061163e818b8b6129bb565b611649818989612abe565b600e54600f54611668916001600160a01b039182169184911686612be9565b60105460408051630134c3db60e51b815290516000926001600160a01b0316916326987b609160048083019260209291908290030181865afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613ad5565b6010546040516340c10f1960e01b81526001600160a01b03858116600483015260ff871660248301529293509116906340c10f1990604401600060405180830381600087803b15801561172857600080fd5b505af115801561173c573d6000803e3d6000fd5b505050507f1fc6a5eaf355cfb9127582b670f3e754dda3dffe7124093d4980a840148f80e88282868e8e8e8e60405161177b9796959493929190613aee565b60405180910390a15050600c805460ff19166001179055505050505050505050565b6001600160a01b03821660009081526013602052604081206117bf90836125cb565b9392505050565b6117cf33611c4e565b6117eb5760405162461bcd60e51b8152600401610db390613960565b6117f481612c41565b50565b61180033611c4e565b61181c5760405162461bcd60e51b8152600401610db390613960565b610dcf8282600061137d565b610d8983838360405180602001604052806000815250612265565b61184c33611c4e565b6118685760405162461bcd60e51b8152600401610db390613960565b600e805460ff909216600160a81b0260ff60a81b19909216919091179055565b600a546001600160a01b031633146118b25760405162461bcd60e51b8152600401610db390613b3d565b6001600160a01b0382166000818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b910160405180910390a15050565b600061192082612508565b61195e5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b6044820152606401610db3565b61196782612c54565b5192915050565b6011805461197b90613925565b80601f01602080910402602001604051908101604052809291908181526020018280546119a790613925565b80156119f45780601f106119c9576101008083540402835291602001916119f4565b820191906000526020600020905b8154815290600101906020018083116119d757829003601f168201915b505050505081565b6001600160a01b0381166000908152601360205260408120610c24906125c1565b611a2633611c4e565b611a425760405162461bcd60e51b8152600401610db390613960565b600c80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6001600160a01b038116600090815260136020526040812060609190611a91906125c1565b90506000816001600160401b03811115611aad57611aad6134cb565b604051908082528060200260200182016040528015611ad6578160200160208202803683370190505b5090506000805b83811015611b7a576001600160a01b0386166000908152601360205260408120611b0790836125cb565b6010546000828152601460205260409020549192504291611b3591600160a01b900463ffffffff16906139ed565b1015611b675780848381518110611b4e57611b4e6139c1565b602090810291909101015282611b6381613a29565b9350505b5080611b7281613a29565b915050611add565b50806001600160401b03811115611b9357611b936134cb565b604051908082528060200260200182016040528015611bbc578160200160208202803683370190505b5093506000805b84811015611c44576000848281518110611bdf57611bdf6139c1565b60200260200101511115611c3257838181518110611bff57611bff6139c1565b6020026020010151868381518110611c1957611c196139c1565b602090810291909101015281611c2e81613a29565b9250505b80611c3c81613a29565b915050611bc3565b5050505050919050565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160a01b038216611c95576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6060611cc4612d7b565b905090565b600a546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610db390613b3d565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b611d4633611c4e565b611d625760405162461bcd60e51b8152600401610db390613960565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611d8d33611c4e565b611da95760405162461bcd60e51b8152600401610db390613960565b600c80549115156101000261ff0019909216919091179055565b611dcc33611c4e565b611de85760405162461bcd60e51b8152600401610db390613960565b601255565b611df633611c4e565b611e125760405162461bcd60e51b8152600401610db390613960565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c3990613925565b6001600160a01b038216331415611e6d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460ff16600114611efe5760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690819055610100900460ff16158015611f335750600e54600160b01b900461ffff16611f306111d8565b11155b611f785760405162461bcd60e51b81526020600482015260166024820152751b9bdd081cdd185c9d1959081bdc881cdd1bdc1c195960521b6044820152606401610db3565b600e54336000818152601560205260409020549091600160a01b900460ff1690611fa3908490613b72565b60ff161115611fdd5760405162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b6044820152606401610db3565b6040516bffffffffffffffffffffffff19606083811b8216602084015246603484015230901b1660548201526001600160f81b031960f884901b16606882015260019060690160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa1580156120ca573d6000803e3d6000fd5b5050604051601f190151600c546201000090046001600160a01b0390811691161490506121225760405162461bcd60e51b8152600401610db39060208082526004908201526339b4b3b760e11b604082015260600190565b6001600160a01b0381166000908152601560205260408120805460ff8516929061214d9084906139ed565b90915550506012546000906121669060ff851690613ab6565b90503481146121a35760405162461bcd60e51b81526020600482015260096024820152686574682077726f6e6760b81b6044820152606401610db3565b600d546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156121dd573d6000803e3d6000fd5b5060006121e86111d8565b6121f39060016139ed565b90506122048360ff8616600061137d565b604080516001600160a01b03851681526020810183905260ff86168183015290517f993dee5ffeb0f11f4b224a13edc0c66743b3b9d4935d94c8814058cd4c29f9519181900360600190a15050600c805460ff191660011790555050505050565b6122708484846127aa565b6001600160a01b0383163b15158015612292575061229084848484612d8a565b155b156122b0576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606122c182612508565b6122de57604051630a14c4b560e41b815260040160405180910390fd5b60006122e8612d7b565b905080516000141561230957604051806020016040528060008152506117bf565b8061231384612e6f565b604051602001612324929190613b97565b6040516020818303038152906040529392505050565b61234333611c4e565b61235f5760405162461bcd60e51b8152600401610db390613960565b600e805460ff909216600160a01b0260ff60a01b19909216919091179055565b61238833611c4e565b6123a45760405162461bcd60e51b8152600401610db390613960565b6010805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b031633146123f45760405162461bcd60e51b8152600401610db390613b3d565b6001600160a01b0381166124595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db3565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6124be33611c4e565b6124da5760405162461bcd60e51b8152600401610db390613960565b600d80546001600160a01b039384166001600160a01b031991821617909155600e8054929093169116179055565b60008160011115801561251c575060015482105b8015610c24575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600081815260018301602052604081205415156117bf565b60006117bf8383612f6c565b6000610c24825490565b60006117bf838361305f565b6001546001600160a01b03851661260057604051622e076360e81b815260040160405180910390fd5b8361261e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156126cf57506001600160a01b0387163b15155b15612758575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127206000888480600101955088612d8a565b61273d576040516368d2bf6b60e11b815260040160405180910390fd5b808214156126d557826001541461275357600080fd5b61279e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612759575b506001555b5050505050565b60006127b582612c54565b80519091506000906001600160a01b0316336001600160a01b031614806127e3575081516127e39033610b61565b806127fe5750336127f384610cbc565b6001600160a01b0316145b90508061281e57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146128535760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661287a57604051633a954ecd60e21b815260040160405180910390fd5b61288a6000848460000151612541565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166129745760015481101561297457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127a3565b60005b818110156122b05760008383838181106129da576129da6139c1565b90506020020160208101906129ef9190613706565b63ffffffff169050600154811015612a1157612a0c853083611828565b612a78565b601054604051632142170760e11b81526001600160a01b03909116906342842e0e90612a4590889030908690600401613a05565b600060405180830381600087803b158015612a5f57600080fd5b505af1158015612a73573d6000803e3d6000fd5b505050505b6001600160a01b0385166000908152601360205260409020612a9a90826130e5565b50600090815260146020526040902042905580612ab681613a29565b9150506129be565b60005b818110156122b0576000838383818110612add57612add6139c1565b9050602002016020810190612af29190613706565b6001600160a01b038616600090815260136020526040902063ffffffff9182169250612b2091839061259d16565b612b565760405162461bcd60e51b81526020600482015260076024820152663737ba1037bbb760c91b6044820152606401610db3565b60105460008281526014602052604090205463ffffffff42811692612b8692600160a01b909104909116906139ed565b10612bc05760405162461bcd60e51b815260206004820152600a60248201526963616e6e6f742075736560b01b6044820152606401610db3565b600090815260146020526040902063ffffffff4216905580612be181613a29565b915050612ac1565b6122b0846323b872dd60e01b858585604051602401612c0a93929190613a05565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130f1565b8051610dcf90600990602084019061331d565b60408051606081018252600080825260208201819052918101919091528180600111158015612c84575060015481105b15612d6257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612d605780516001600160a01b031615612cf7579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612d5b579392505050565b612cf7565b505b604051636f96cda160e11b815260040160405180910390fd5b606060098054610c3990613925565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612dbf903390899088908890600401613bc6565b6020604051808303816000875af1925050508015612dfa575060408051601f3d908101601f19168201909252612df791810190613c03565b60015b612e55573d808015612e28576040519150601f19603f3d011682016040523d82523d6000602084013e612e2d565b606091505b508051612e4d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110b7565b606081612e935750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ebd5780612ea781613a29565b9150612eb69050600a83613c36565b9150612e97565b6000816001600160401b03811115612ed757612ed76134cb565b6040519080825280601f01601f191660200182016040528015612f01576020820181803683370190505b5090505b84156110b757612f16600183613c4a565b9150612f23600a86613c61565b612f2e9060306139ed565b60f81b818381518110612f4357612f436139c1565b60200101906001600160f81b031916908160001a905350612f65600a86613c36565b9450612f05565b60008181526001830160205260408120548015613055576000612f90600183613c4a565b8554909150600090612fa490600190613c4a565b90506000866000018281548110612fbd57612fbd6139c1565b9060005260206000200154905080876000018481548110612fe057612fe06139c1565b600091825260209091200155612ff78360016139ed565b6000828152600189016020526040902055865487908061301957613019613c75565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c24565b6000915050610c24565b815460009082106130bd5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610db3565b8260000182815481106130d2576130d26139c1565b9060005260206000200154905092915050565b60006117bf83836131c3565b6000613146826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132129092919063ffffffff16565b805190915015610d8957808060200190518101906131649190613c8b565b610d895760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610db3565b600081815260018301602052604081205461320a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c24565b506000610c24565b60606110b7848460008585843b61326b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610db3565b600080866001600160a01b031685876040516132879190613ca8565b60006040518083038185875af1925050503d80600081146132c4576040519150601f19603f3d011682016040523d82523d6000602084013e6132c9565b606091505b50915091506132d98282866132e4565b979650505050505050565b606083156132f35750816117bf565b8251156133035782518084602001fd5b8160405162461bcd60e51b8152600401610db39190613441565b82805461332990613925565b90600052602060002090601f01602090048101928261334b5760008555613391565b82601f1061336457805160ff1916838001178555613391565b82800160010185558215613391579182015b82811115613391578251825591602001919060010190613376565b5061339d9291506133a1565b5090565b5b8082111561339d57600081556001016133a2565b6001600160e01b0319811681146117f457600080fd5b6000602082840312156133de57600080fd5b81356117bf816133b6565b60005b838110156134045781810151838201526020016133ec565b838111156122b05750506000910152565b6000815180845261342d8160208601602086016133e9565b601f01601f19169290920160200192915050565b6020815260006117bf6020830184613415565b60006020828403121561346657600080fd5b5035919050565b6001600160a01b03811681146117f457600080fd5b6000806040838503121561349557600080fd5b82356134a08161346d565b946020939093013593505050565b6000602082840312156134c057600080fd5b81356117bf8161346d565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156134fb576134fb6134cb565b604051601f8501601f19908116603f01168101908282118183101715613523576135236134cb565b8160405280935085815286868601111561353c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561356857600080fd5b81356001600160401b0381111561357e57600080fd5b8201601f8101841361358f57600080fd5b6110b7848235602084016134e1565b60008083601f8401126135b057600080fd5b5081356001600160401b038111156135c757600080fd5b6020830191508360208260051b85010111156135e257600080fd5b9250929050565b600080602083850312156135fc57600080fd5b82356001600160401b0381111561361257600080fd5b61361e8582860161359e565b90969095509350505050565b6000806000806080858703121561364057600080fd5b843561364b8161346d565b9350602085013561365b8161346d565b92506040850135915060608501356001600160401b0381111561367d57600080fd5b8501601f8101871361368e57600080fd5b61369d878235602084016134e1565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b818110156136e1578351835292840192918401916001016136c5565b50909695505050505050565b803563ffffffff8116811461370157600080fd5b919050565b60006020828403121561371857600080fd5b6117bf826136ed565b803560ff8116811461370157600080fd5b60006020828403121561374457600080fd5b6117bf82613721565b60006020828403121561375f57600080fd5b813561ffff811681146117bf57600080fd5b60008060006060848603121561378657600080fd5b83356137918161346d565b925060208401356137a18161346d565b929592945050506040919091013590565b60008060008060008060008060c0898b0312156137ce57600080fd5b88356001600160401b03808211156137e557600080fd5b6137f18c838d0161359e565b909a50985060208b013591508082111561380a57600080fd5b506138178b828c0161359e565b909750955050604089013593506060890135925061383760808a01613721565b915060a089013590509295985092959890939650565b80151581146117f457600080fd5b6000806040838503121561386e57600080fd5b82356138798161346d565b915060208301356138898161384d565b809150509250929050565b6000602082840312156138a657600080fd5b81356117bf8161384d565b600080600080608085870312156138c757600080fd5b84359350602085013592506138de60408601613721565b91506138ec60608601613721565b905092959194509250565b6000806040838503121561390a57600080fd5b82356139158161346d565b915060208301356138898161346d565b600181811c9082168061393957607f821691505b6020821081141561395a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f63616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b60208082526010908201526f10dbdb9d1c9858dd0e881313d0d2d15160821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613a0057613a006139d7565b500190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000600019821415613a3d57613a3d6139d7565b5060010190565b8183526000602080850194508260005b85811015613a7d5763ffffffff613a6a836136ed565b1687529582019590820190600101613a54565b509495945050505050565b6001600160a01b0384168152604060208201819052600090613aad9083018486613a44565b95945050505050565b6000816000190483118215151615613ad057613ad06139d7565b500290565b600060208284031215613ae757600080fd5b5051919050565b60018060a01b038816815286602082015285604082015260a060608201526000613b1c60a083018688613a44565b8281036080840152613b2f818587613a44565b9a9950505050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060ff821660ff84168060ff03821115613b8f57613b8f6139d7565b019392505050565b60008351613ba98184602088016133e9565b835190830190613bbd8183602088016133e9565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bf990830184613415565b9695505050505050565b600060208284031215613c1557600080fd5b81516117bf816133b6565b634e487b7160e01b600052601260045260246000fd5b600082613c4557613c45613c20565b500490565b600082821015613c5c57613c5c6139d7565b500390565b600082613c7057613c70613c20565b500690565b634e487b7160e01b600052603160045260246000fd5b600060208284031215613c9d57600080fd5b81516117bf8161384d565b60008251613cba8184602087016133e9565b919091019291505056fea26469706673582212208e9621b6fd020abbffe85197a2905757657c41629ce843be4bd71ee736a03f7b64736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000084469616c6f67657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084469616c6f676572000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103975760003560e01c80636373a6b1116101dc578063977e862e11610102578063c4eaca34116100a0578063e8b23f661161006f578063e8b23f6614610b19578063e985e9c514610b46578063f2fde38b14610b8f578063f52564ec14610baf57600080fd5b8063c4eaca3414610a98578063c87b56dd14610ab9578063d7cb529614610ad9578063e0bec26d14610af957600080fd5b8063a22cb465116100dc578063a22cb46514610a15578063a80a940014610a35578063b561f16014610a48578063b88d4fde14610a7857600080fd5b8063977e862e146109aa5780639ef2d87a146109ca578063a035b1fe146109ff57600080fd5b8063714c53981161017a5780638da5cb5b116101495780638da5cb5b1461093757806391b7f5ed146109555780639499a6cc1461097557806395d89b411461099557600080fd5b8063714c5398146108cd578063715018a6146108e25780637af43144146108f7578063856e136a1461091757600080fd5b80636d40228f116101b65780636d40228f146108405780636d70f7ae1461086057806370a082311461088057806370ae92d2146108a057600080fd5b80636373a6b1146107eb57806366fb5fb9146108005780636c19e7831461082057600080fd5b80631bcc80ac116102c157806330176e131161025f5780634c3ec07b1161022e5780634c3ec07b1461076b5780634cfe72e61461078b578063558a7297146107ab5780636352211e146107cb57600080fd5b806330176e13146106d857806340c10f19146106f857806342842e0e1461071857806347a7cf401461073857600080fd5b8063238ac9331161029b578063238ac9331461065257806323b872dd1461067857806327517649146106985780632bcf8f47146106b857600080fd5b80631bcc80ac146105ff5780632060a1501461061257806323190fa91461063257600080fd5b806310aa006d1161033957806318160ddd1161030857806318160ddd1461058757806318e20a381461059c57806319cfca94146105c05780631a23cda3146105e057600080fd5b806310aa006d146104e1578063150b7a0214610501578063151c9ba41461053a57806316bcac151461056757600080fd5b8063095ea7b311610375578063095ea7b31461042b57806309bcdeca1461044d5780630a398b881461048657806310969523146104c157600080fd5b806301ffc9a71461039c57806306fdde03146103d1578063081812fc146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046133cc565b610bcf565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103e6610c2a565b6040516103c89190613441565b3480156103ff57600080fd5b5061041361040e366004613454565b610cbc565b6040516001600160a01b0390911681526020016103c8565b34801561043757600080fd5b5061044b610446366004613482565b610d00565b005b34801561045957600080fd5b5060105461047190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016103c8565b34801561049257600080fd5b506104b36104a13660046134ae565b60156020526000908152604090205481565b6040519081526020016103c8565b3480156104cd57600080fd5b5061044b6104dc366004613556565b610d8e565b3480156104ed57600080fd5b5061044b6104fc3660046135e9565b610dd3565b34801561050d57600080fd5b5061052161051c36600461362a565b6110ae565b6040516001600160e01b031990911681526020016103c8565b34801561054657600080fd5b5061055a6105553660046134ae565b6110bf565b6040516103c891906136a9565b34801561057357600080fd5b5061044b610582366004613706565b61118d565b34801561059357600080fd5b506104b36111d8565b3480156105a857600080fd5b50600e5461047190600160c01b900463ffffffff1681565b3480156105cc57600080fd5b50600f54610413906001600160a01b031681565b3480156105ec57600080fd5b50600c546103bc90610100900460ff1681565b61044b61060d366004613732565b6111e6565b34801561061e57600080fd5b50601054610413906001600160a01b031681565b34801561063e57600080fd5b5061044b61064d36600461374d565b61140d565b34801561065e57600080fd5b50600c54610413906201000090046001600160a01b031681565b34801561068457600080fd5b5061044b610693366004613771565b611454565b3480156106a457600080fd5b5061044b6106b33660046137b2565b61145f565b3480156106c457600080fd5b506104b36106d3366004613482565b61179d565b3480156106e457600080fd5b5061044b6106f3366004613556565b6117c6565b34801561070457600080fd5b5061044b610713366004613482565b6117f7565b34801561072457600080fd5b5061044b610733366004613771565b611828565b34801561074457600080fd5b50600e5461075990600160a01b900460ff1681565b60405160ff90911681526020016103c8565b34801561077757600080fd5b5061044b610786366004613732565b611843565b34801561079757600080fd5b50600d54610413906001600160a01b031681565b3480156107b757600080fd5b5061044b6107c636600461385b565b611888565b3480156107d757600080fd5b506104136107e6366004613454565b611915565b3480156107f757600080fd5b506103e661196e565b34801561080c57600080fd5b506104b361081b3660046134ae565b6119fc565b34801561082c57600080fd5b5061044b61083b3660046134ae565b611a1d565b34801561084c57600080fd5b5061055a61085b3660046134ae565b611a6c565b34801561086c57600080fd5b506103bc61087b3660046134ae565b611c4e565b34801561088c57600080fd5b506104b361089b3660046134ae565b611c6c565b3480156108ac57600080fd5b506104b36108bb3660046134ae565b60166020526000908152604090205481565b3480156108d957600080fd5b506103e6611cba565b3480156108ee57600080fd5b5061044b611cc9565b34801561090357600080fd5b5061044b6109123660046134ae565b611d3d565b34801561092357600080fd5b5061044b610932366004613894565b611d84565b34801561094357600080fd5b50600a546001600160a01b0316610413565b34801561096157600080fd5b5061044b610970366004613454565b611dc3565b34801561098157600080fd5b5061044b6109903660046134ae565b611ded565b3480156109a157600080fd5b506103e6611e34565b3480156109b657600080fd5b50600e54610413906001600160a01b031681565b3480156109d657600080fd5b50600e546109ec90600160b01b900461ffff1681565b60405161ffff90911681526020016103c8565b348015610a0b57600080fd5b506104b360125481565b348015610a2157600080fd5b5061044b610a3036600461385b565b611e43565b61044b610a433660046138b1565b611ed9565b348015610a5457600080fd5b506103bc610a633660046134ae565b600b6020526000908152604090205460ff1681565b348015610a8457600080fd5b5061044b610a9336600461362a565b612265565b348015610aa457600080fd5b50600e5461075990600160a81b900460ff1681565b348015610ac557600080fd5b506103e6610ad4366004613454565b6122b6565b348015610ae557600080fd5b5061044b610af4366004613732565b61233a565b348015610b0557600080fd5b5061044b610b14366004613706565b61237f565b348015610b2557600080fd5b506104b3610b34366004613454565b60146020526000908152604090205481565b348015610b5257600080fd5b506103bc610b613660046138f7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9b57600080fd5b5061044b610baa3660046134ae565b6123ca565b348015610bbb57600080fd5b5061044b610bca3660046138f7565b6124b5565b60006001600160e01b031982166380ac58cd60e01b1480610c0057506001600160e01b03198216635b5e139f60e01b145b80610c2457506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b606060038054610c3990613925565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6590613925565b8015610cb25780601f10610c8757610100808354040283529160200191610cb2565b820191906000526020600020905b815481529060010190602001808311610c9557829003601f168201915b5050505050905090565b6000610cc782612508565b610ce4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610d0b82611915565b9050806001600160a01b0316836001600160a01b03161415610d405760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d605750610d5e8133610b61565b155b15610d7e576040516367d9dca160e11b815260040160405180910390fd5b610d89838383612541565b505050565b610d9733611c4e565b610dbc5760405162461bcd60e51b8152600401610db390613960565b60405180910390fd5b8051610dcf90601190602084019061331d565b5050565b600c5460ff16600114610df85760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690553360005b82811015611060576000848483818110610e2257610e226139c1565b9050602002016020810190610e379190613706565b6001600160a01b038416600090815260136020526040902063ffffffff9182169250610e6591839061259d16565b610ea95760405162461bcd60e51b81526020600482015260156024820152741b9bdd0818dbdb9d185a5b881d1a1a5cc818d85c99605a1b6044820152606401610db3565b6010546000828152601460205260409020544291610ed591600160a01b90910463ffffffff16906139ed565b10610f125760405162461bcd60e51b815260206004820152600d60248201526c63616e6e6f7420756e6c6f636b60981b6044820152606401610db3565b6001600160a01b0383166000908152601360205260409020610f3490826125b5565b610f6f5760405162461bcd60e51b815260206004820152600c60248201526b72656d6f76652066616c736560a01b6044820152606401610db3565b600081815260146020526040812055600154811015610fe657604051632142170760e11b815230906342842e0e90610faf90839087908690600401613a05565b600060405180830381600087803b158015610fc957600080fd5b505af1158015610fdd573d6000803e3d6000fd5b5050505061104d565b601054604051632142170760e11b81526001600160a01b03909116906342842e0e9061101a90309087908690600401613a05565b600060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050505b508061105881613a29565b915050610e06565b507f110a8a977ad904fb51dc3a5466b050a7f37736b638edbbe9c9f3f8faeb2b5f9281848460405161109493929190613a88565b60405180910390a15050600c805460ff1916600117905550565b630a85bd0160e11b5b949350505050565b6001600160a01b0381166000908152601360205260408120606091906110e4906125c1565b9050806001600160401b038111156110fe576110fe6134cb565b604051908082528060200260200182016040528015611127578160200160208202803683370190505b50915060005b81811015611186576001600160a01b038416600090815260136020526040902061115790826125cb565b838281518110611169576111696139c1565b60209081029190910101528061117e81613a29565b91505061112d565b5050919050565b61119633611c4e565b6111b25760405162461bcd60e51b8152600401610db390613960565b600e805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600254600154036000190190565b600c5460ff1660011461120b5760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690819055610100900460ff16801561123f5750600e54600160b01b900461ffff1661123c6111d8565b11155b6112835760405162461bcd60e51b81526020600482015260156024820152741b9bdd081cdd185c9d081bdc881cdbdb19081bdd5d605a1b6044820152606401610db3565b33600061128e6111d8565b6112999060016139ed565b600e5490915060ff600160a81b909104811690841611156112e75760405162461bcd60e51b81526020600482015260086024820152670e8dede40daeac6d60c31b6044820152606401610db3565b60008360ff166012546112fa9190613ab6565b90503481146113375760405162461bcd60e51b81526020600482015260096024820152686574682077726f6e6760b81b6044820152606401610db3565b600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611371573d6000803e3d6000fd5b506113af8360ff861660005b6040519080825280601f01601f1916602001820160405280156113a7576020820181803683370190505b5060006125d7565b604080516001600160a01b03851681526020810184905260ff86168183015290517f17420eb78e67e3358d3212569823e24596995765bc7ed48b88ba7b9f4e7eceac9181900360600190a15050600c805460ff191660011790555050565b61141633611c4e565b6114325760405162461bcd60e51b8152600401610db390613960565b600e805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b610d898383836127aa565b600c5460ff166001146114845760405162461bcd60e51b8152600401610db390613997565b600c805460ff19169055600061149a86896139ed565b336000818152601660209081526040918290205491516bffffffffffffffffffffffff19606085811b8216938301939093524660348301523090921b90911660548201526001600160f81b031960f885901b1660688201526069810186905260898101919091529192509060019060a90160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018890526080810187905260a0016020604051602081039080840390855afa1580156115b2573d6000803e3d6000fd5b5050604051601f190151600c546201000090046001600160a01b03908116911614905061160a5760405162461bcd60e51b8152600401610db39060208082526004908201526339b4b3b760e11b604082015260600190565b6001600160a01b038116600090815260166020526040812080549161162e83613a29565b919050555061163e818b8b6129bb565b611649818989612abe565b600e54600f54611668916001600160a01b039182169184911686612be9565b60105460408051630134c3db60e51b815290516000926001600160a01b0316916326987b609160048083019260209291908290030181865afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613ad5565b6010546040516340c10f1960e01b81526001600160a01b03858116600483015260ff871660248301529293509116906340c10f1990604401600060405180830381600087803b15801561172857600080fd5b505af115801561173c573d6000803e3d6000fd5b505050507f1fc6a5eaf355cfb9127582b670f3e754dda3dffe7124093d4980a840148f80e88282868e8e8e8e60405161177b9796959493929190613aee565b60405180910390a15050600c805460ff19166001179055505050505050505050565b6001600160a01b03821660009081526013602052604081206117bf90836125cb565b9392505050565b6117cf33611c4e565b6117eb5760405162461bcd60e51b8152600401610db390613960565b6117f481612c41565b50565b61180033611c4e565b61181c5760405162461bcd60e51b8152600401610db390613960565b610dcf8282600061137d565b610d8983838360405180602001604052806000815250612265565b61184c33611c4e565b6118685760405162461bcd60e51b8152600401610db390613960565b600e805460ff909216600160a81b0260ff60a81b19909216919091179055565b600a546001600160a01b031633146118b25760405162461bcd60e51b8152600401610db390613b3d565b6001600160a01b0382166000818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b910160405180910390a15050565b600061192082612508565b61195e5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b6044820152606401610db3565b61196782612c54565b5192915050565b6011805461197b90613925565b80601f01602080910402602001604051908101604052809291908181526020018280546119a790613925565b80156119f45780601f106119c9576101008083540402835291602001916119f4565b820191906000526020600020905b8154815290600101906020018083116119d757829003601f168201915b505050505081565b6001600160a01b0381166000908152601360205260408120610c24906125c1565b611a2633611c4e565b611a425760405162461bcd60e51b8152600401610db390613960565b600c80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6001600160a01b038116600090815260136020526040812060609190611a91906125c1565b90506000816001600160401b03811115611aad57611aad6134cb565b604051908082528060200260200182016040528015611ad6578160200160208202803683370190505b5090506000805b83811015611b7a576001600160a01b0386166000908152601360205260408120611b0790836125cb565b6010546000828152601460205260409020549192504291611b3591600160a01b900463ffffffff16906139ed565b1015611b675780848381518110611b4e57611b4e6139c1565b602090810291909101015282611b6381613a29565b9350505b5080611b7281613a29565b915050611add565b50806001600160401b03811115611b9357611b936134cb565b604051908082528060200260200182016040528015611bbc578160200160208202803683370190505b5093506000805b84811015611c44576000848281518110611bdf57611bdf6139c1565b60200260200101511115611c3257838181518110611bff57611bff6139c1565b6020026020010151868381518110611c1957611c196139c1565b602090810291909101015281611c2e81613a29565b9250505b80611c3c81613a29565b915050611bc3565b5050505050919050565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160a01b038216611c95576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6060611cc4612d7b565b905090565b600a546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610db390613b3d565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b611d4633611c4e565b611d625760405162461bcd60e51b8152600401610db390613960565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611d8d33611c4e565b611da95760405162461bcd60e51b8152600401610db390613960565b600c80549115156101000261ff0019909216919091179055565b611dcc33611c4e565b611de85760405162461bcd60e51b8152600401610db390613960565b601255565b611df633611c4e565b611e125760405162461bcd60e51b8152600401610db390613960565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c3990613925565b6001600160a01b038216331415611e6d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460ff16600114611efe5760405162461bcd60e51b8152600401610db390613997565b600c805460ff191690819055610100900460ff16158015611f335750600e54600160b01b900461ffff16611f306111d8565b11155b611f785760405162461bcd60e51b81526020600482015260166024820152751b9bdd081cdd185c9d1959081bdc881cdd1bdc1c195960521b6044820152606401610db3565b600e54336000818152601560205260409020549091600160a01b900460ff1690611fa3908490613b72565b60ff161115611fdd5760405162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b6044820152606401610db3565b6040516bffffffffffffffffffffffff19606083811b8216602084015246603484015230901b1660548201526001600160f81b031960f884901b16606882015260019060690160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa1580156120ca573d6000803e3d6000fd5b5050604051601f190151600c546201000090046001600160a01b0390811691161490506121225760405162461bcd60e51b8152600401610db39060208082526004908201526339b4b3b760e11b604082015260600190565b6001600160a01b0381166000908152601560205260408120805460ff8516929061214d9084906139ed565b90915550506012546000906121669060ff851690613ab6565b90503481146121a35760405162461bcd60e51b81526020600482015260096024820152686574682077726f6e6760b81b6044820152606401610db3565b600d546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156121dd573d6000803e3d6000fd5b5060006121e86111d8565b6121f39060016139ed565b90506122048360ff8616600061137d565b604080516001600160a01b03851681526020810183905260ff86168183015290517f993dee5ffeb0f11f4b224a13edc0c66743b3b9d4935d94c8814058cd4c29f9519181900360600190a15050600c805460ff191660011790555050505050565b6122708484846127aa565b6001600160a01b0383163b15158015612292575061229084848484612d8a565b155b156122b0576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606122c182612508565b6122de57604051630a14c4b560e41b815260040160405180910390fd5b60006122e8612d7b565b905080516000141561230957604051806020016040528060008152506117bf565b8061231384612e6f565b604051602001612324929190613b97565b6040516020818303038152906040529392505050565b61234333611c4e565b61235f5760405162461bcd60e51b8152600401610db390613960565b600e805460ff909216600160a01b0260ff60a01b19909216919091179055565b61238833611c4e565b6123a45760405162461bcd60e51b8152600401610db390613960565b6010805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b031633146123f45760405162461bcd60e51b8152600401610db390613b3d565b6001600160a01b0381166124595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db3565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6124be33611c4e565b6124da5760405162461bcd60e51b8152600401610db390613960565b600d80546001600160a01b039384166001600160a01b031991821617909155600e8054929093169116179055565b60008160011115801561251c575060015482105b8015610c24575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600081815260018301602052604081205415156117bf565b60006117bf8383612f6c565b6000610c24825490565b60006117bf838361305f565b6001546001600160a01b03851661260057604051622e076360e81b815260040160405180910390fd5b8361261e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156126cf57506001600160a01b0387163b15155b15612758575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127206000888480600101955088612d8a565b61273d576040516368d2bf6b60e11b815260040160405180910390fd5b808214156126d557826001541461275357600080fd5b61279e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612759575b506001555b5050505050565b60006127b582612c54565b80519091506000906001600160a01b0316336001600160a01b031614806127e3575081516127e39033610b61565b806127fe5750336127f384610cbc565b6001600160a01b0316145b90508061281e57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146128535760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661287a57604051633a954ecd60e21b815260040160405180910390fd5b61288a6000848460000151612541565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166129745760015481101561297457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127a3565b60005b818110156122b05760008383838181106129da576129da6139c1565b90506020020160208101906129ef9190613706565b63ffffffff169050600154811015612a1157612a0c853083611828565b612a78565b601054604051632142170760e11b81526001600160a01b03909116906342842e0e90612a4590889030908690600401613a05565b600060405180830381600087803b158015612a5f57600080fd5b505af1158015612a73573d6000803e3d6000fd5b505050505b6001600160a01b0385166000908152601360205260409020612a9a90826130e5565b50600090815260146020526040902042905580612ab681613a29565b9150506129be565b60005b818110156122b0576000838383818110612add57612add6139c1565b9050602002016020810190612af29190613706565b6001600160a01b038616600090815260136020526040902063ffffffff9182169250612b2091839061259d16565b612b565760405162461bcd60e51b81526020600482015260076024820152663737ba1037bbb760c91b6044820152606401610db3565b60105460008281526014602052604090205463ffffffff42811692612b8692600160a01b909104909116906139ed565b10612bc05760405162461bcd60e51b815260206004820152600a60248201526963616e6e6f742075736560b01b6044820152606401610db3565b600090815260146020526040902063ffffffff4216905580612be181613a29565b915050612ac1565b6122b0846323b872dd60e01b858585604051602401612c0a93929190613a05565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526130f1565b8051610dcf90600990602084019061331d565b60408051606081018252600080825260208201819052918101919091528180600111158015612c84575060015481105b15612d6257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612d605780516001600160a01b031615612cf7579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612d5b579392505050565b612cf7565b505b604051636f96cda160e11b815260040160405180910390fd5b606060098054610c3990613925565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612dbf903390899088908890600401613bc6565b6020604051808303816000875af1925050508015612dfa575060408051601f3d908101601f19168201909252612df791810190613c03565b60015b612e55573d808015612e28576040519150601f19603f3d011682016040523d82523d6000602084013e612e2d565b606091505b508051612e4d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110b7565b606081612e935750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ebd5780612ea781613a29565b9150612eb69050600a83613c36565b9150612e97565b6000816001600160401b03811115612ed757612ed76134cb565b6040519080825280601f01601f191660200182016040528015612f01576020820181803683370190505b5090505b84156110b757612f16600183613c4a565b9150612f23600a86613c61565b612f2e9060306139ed565b60f81b818381518110612f4357612f436139c1565b60200101906001600160f81b031916908160001a905350612f65600a86613c36565b9450612f05565b60008181526001830160205260408120548015613055576000612f90600183613c4a565b8554909150600090612fa490600190613c4a565b90506000866000018281548110612fbd57612fbd6139c1565b9060005260206000200154905080876000018481548110612fe057612fe06139c1565b600091825260209091200155612ff78360016139ed565b6000828152600189016020526040902055865487908061301957613019613c75565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c24565b6000915050610c24565b815460009082106130bd5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610db3565b8260000182815481106130d2576130d26139c1565b9060005260206000200154905092915050565b60006117bf83836131c3565b6000613146826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132129092919063ffffffff16565b805190915015610d8957808060200190518101906131649190613c8b565b610d895760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610db3565b600081815260018301602052604081205461320a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c24565b506000610c24565b60606110b7848460008585843b61326b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610db3565b600080866001600160a01b031685876040516132879190613ca8565b60006040518083038185875af1925050503d80600081146132c4576040519150601f19603f3d011682016040523d82523d6000602084013e6132c9565b606091505b50915091506132d98282866132e4565b979650505050505050565b606083156132f35750816117bf565b8251156133035782518084602001fd5b8160405162461bcd60e51b8152600401610db39190613441565b82805461332990613925565b90600052602060002090601f01602090048101928261334b5760008555613391565b82601f1061336457805160ff1916838001178555613391565b82800160010185558215613391579182015b82811115613391578251825591602001919060010190613376565b5061339d9291506133a1565b5090565b5b8082111561339d57600081556001016133a2565b6001600160e01b0319811681146117f457600080fd5b6000602082840312156133de57600080fd5b81356117bf816133b6565b60005b838110156134045781810151838201526020016133ec565b838111156122b05750506000910152565b6000815180845261342d8160208601602086016133e9565b601f01601f19169290920160200192915050565b6020815260006117bf6020830184613415565b60006020828403121561346657600080fd5b5035919050565b6001600160a01b03811681146117f457600080fd5b6000806040838503121561349557600080fd5b82356134a08161346d565b946020939093013593505050565b6000602082840312156134c057600080fd5b81356117bf8161346d565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156134fb576134fb6134cb565b604051601f8501601f19908116603f01168101908282118183101715613523576135236134cb565b8160405280935085815286868601111561353c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561356857600080fd5b81356001600160401b0381111561357e57600080fd5b8201601f8101841361358f57600080fd5b6110b7848235602084016134e1565b60008083601f8401126135b057600080fd5b5081356001600160401b038111156135c757600080fd5b6020830191508360208260051b85010111156135e257600080fd5b9250929050565b600080602083850312156135fc57600080fd5b82356001600160401b0381111561361257600080fd5b61361e8582860161359e565b90969095509350505050565b6000806000806080858703121561364057600080fd5b843561364b8161346d565b9350602085013561365b8161346d565b92506040850135915060608501356001600160401b0381111561367d57600080fd5b8501601f8101871361368e57600080fd5b61369d878235602084016134e1565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b818110156136e1578351835292840192918401916001016136c5565b50909695505050505050565b803563ffffffff8116811461370157600080fd5b919050565b60006020828403121561371857600080fd5b6117bf826136ed565b803560ff8116811461370157600080fd5b60006020828403121561374457600080fd5b6117bf82613721565b60006020828403121561375f57600080fd5b813561ffff811681146117bf57600080fd5b60008060006060848603121561378657600080fd5b83356137918161346d565b925060208401356137a18161346d565b929592945050506040919091013590565b60008060008060008060008060c0898b0312156137ce57600080fd5b88356001600160401b03808211156137e557600080fd5b6137f18c838d0161359e565b909a50985060208b013591508082111561380a57600080fd5b506138178b828c0161359e565b909750955050604089013593506060890135925061383760808a01613721565b915060a089013590509295985092959890939650565b80151581146117f457600080fd5b6000806040838503121561386e57600080fd5b82356138798161346d565b915060208301356138898161384d565b809150509250929050565b6000602082840312156138a657600080fd5b81356117bf8161384d565b600080600080608085870312156138c757600080fd5b84359350602085013592506138de60408601613721565b91506138ec60608601613721565b905092959194509250565b6000806040838503121561390a57600080fd5b82356139158161346d565b915060208301356138898161346d565b600181811c9082168061393957607f821691505b6020821081141561395a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f63616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b60208082526010908201526f10dbdb9d1c9858dd0e881313d0d2d15160821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613a0057613a006139d7565b500190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000600019821415613a3d57613a3d6139d7565b5060010190565b8183526000602080850194508260005b85811015613a7d5763ffffffff613a6a836136ed565b1687529582019590820190600101613a54565b509495945050505050565b6001600160a01b0384168152604060208201819052600090613aad9083018486613a44565b95945050505050565b6000816000190483118215151615613ad057613ad06139d7565b500290565b600060208284031215613ae757600080fd5b5051919050565b60018060a01b038816815286602082015285604082015260a060608201526000613b1c60a083018688613a44565b8281036080840152613b2f818587613a44565b9a9950505050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060ff821660ff84168060ff03821115613b8f57613b8f6139d7565b019392505050565b60008351613ba98184602088016133e9565b835190830190613bbd8183602088016133e9565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bf990830184613415565b9695505050505050565b600060208284031215613c1557600080fd5b81516117bf816133b6565b634e487b7160e01b600052601260045260246000fd5b600082613c4557613c45613c20565b500490565b600082821015613c5c57613c5c6139d7565b500390565b600082613c7057613c70613c20565b500690565b634e487b7160e01b600052603160045260246000fd5b600060208284031215613c9d57600080fd5b81516117bf8161384d565b60008251613cba8184602087016133e9565b919091019291505056fea26469706673582212208e9621b6fd020abbffe85197a2905757657c41629ce843be4bd71ee736a03f7b64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000084469616c6f67657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084469616c6f676572000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Dialoger
Arg [1] : _symbol (string): Dialoger
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 4469616c6f676572000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 4469616c6f676572000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
60273:8958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29198:285;;;;;;;;;;-1:-1:-1;29198:285:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29198:285:0;;;;;;;;32534:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34044:204::-;;;;;;;;;;-1:-1:-1;34044:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;34044:204:0;1528:203:1;33607:371:0;;;;;;;;;;-1:-1:-1;33607:371:0;;;;;:::i;:::-;;:::i;:::-;;61055:35;;;;;;;;;;-1:-1:-1;61055:35:0;;;;-1:-1:-1;;;61055:35:0;;;;;;;;;2366:10:1;2354:23;;;2336:42;;2324:2;2309:18;61055:35:0;2192:192:1;61371:48:0;;;;;;;;;;-1:-1:-1;61371:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2787:25:1;;;2775:2;2760:18;61371:48:0;2641:177:1;69105:123:0;;;;;;;;;;-1:-1:-1;69105:123:0;;;;;:::i;:::-;;:::i;63822:769::-;;;;;;;;;;-1:-1:-1;63822:769:0;;;;;:::i;:::-;;:::i;68769:195::-;;;;;;;;;;-1:-1:-1;68769:195:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;5821:33:1;;;5803:52;;5791:2;5776:18;68769:195:0;5659:202:1;66612:262:0;;;;;;;;;;-1:-1:-1;66612:262:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68972:125::-;;;;;;;;;;-1:-1:-1;68972:125:0;;;;;:::i;:::-;;:::i;28471:291::-;;;;;;;;;;;;;:::i;60909:30::-;;;;;;;;;;-1:-1:-1;60909:30:0;;;;-1:-1:-1;;;60909:30:0;;;;;;60946:76;;;;;;;;;;-1:-1:-1;60946:76:0;;;;-1:-1:-1;;;;;60946:76:0;;;60497:31;;;;;;;;;;-1:-1:-1;60497:31:0;;;;;;;;;;;65443:536;;;;;;:::i;:::-;;:::i;61029:19::-;;;;;;;;;;-1:-1:-1;61029:19:0;;;;-1:-1:-1;;;;;61029:19:0;;;68353:100;;;;;;;;;;-1:-1:-1;68353:100:0;;;;;:::i;:::-;;:::i;60535:66::-;;;;;;;;;;-1:-1:-1;60535:66:0;;;;;;;-1:-1:-1;;;;;60535:66:0;;;34901:170;;;;;;;;;;-1:-1:-1;34901:170:0;;;;;:::i;:::-;;:::i;61980:902::-;;;;;;;;;;-1:-1:-1;61980:902:0;;;;;:::i;:::-;;:::i;66468:136::-;;;;;;;;;;-1:-1:-1;66468:136:0;;;;;:::i;:::-;;:::i;66114:119::-;;;;;;;;;;-1:-1:-1;66114:119:0;;;;;:::i;:::-;;:::i;65987:::-;;;;;;;;;;-1:-1:-1;65987:119:0;;;;;:::i;:::-;;:::i;35142:185::-;;;;;;;;;;-1:-1:-1;35142:185:0;;;;;:::i;:::-;;:::i;60788:33::-;;;;;;;;;;-1:-1:-1;60788:33:0;;;;-1:-1:-1;;;60788:33:0;;;;;;;;;9615:4:1;9603:17;;;9585:36;;9573:2;9558:18;60788:33:0;9443:184:1;68202:143:0;;;;;;;;;;-1:-1:-1;68202:143:0;;;;;:::i;:::-;;:::i;60608:91::-;;;;;;;;;;-1:-1:-1;60608:91:0;;;;-1:-1:-1;;;;;60608:91:0;;;49039:145;;;;;;;;;;-1:-1:-1;49039:145:0;;;;;:::i;:::-;;:::i;32288:179::-;;;;;;;;;;-1:-1:-1;32288:179:0;;;;;:::i;:::-;;:::i;61099:24::-;;;;;;;;;;;;;:::i;66341:119::-;;;;;;;;;;-1:-1:-1;66341:119:0;;;;;:::i;:::-;;:::i;67844:93::-;;;;;;;;;;-1:-1:-1;67844:93:0;;;;;:::i;:::-;;:::i;66882:648::-;;;;;;;;;;-1:-1:-1;66882:648:0;;;;;:::i;:::-;;:::i;49192:104::-;;;;;;;;;;-1:-1:-1;49192:104:0;;;;;:::i;:::-;;:::i;29547:206::-;;;;;;;;;;-1:-1:-1;29547:206:0;;;;;:::i;:::-;;:::i;61426:40::-;;;;;;;;;;-1:-1:-1;61426:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;66241:92;;;;;;;;;;;;;:::i;48037:148::-;;;;;;;;;;;;;:::i;68557:104::-;;;;;;;;;;-1:-1:-1;68557:104:0;;;;;:::i;:::-;;:::i;67945:110::-;;;;;;;;;;-1:-1:-1;67945:110:0;;;;;:::i;:::-;;:::i;47390:87::-;;;;;;;;;;-1:-1:-1;47463:6:0;;-1:-1:-1;;;;;47463:6:0;47390:87;;67538:89;;;;;;;;;;-1:-1:-1;67538:89:0;;;;;:::i;:::-;;:::i;68461:88::-;;;;;;;;;;-1:-1:-1;68461:88:0;;;;;:::i;:::-;;:::i;32703:104::-;;;;;;;;;;;;;:::i;60706:75::-;;;;;;;;;;-1:-1:-1;60706:75:0;;;;-1:-1:-1;;;;;60706:75:0;;;60872:30;;;;;;;;;;-1:-1:-1;60872:30:0;;;;-1:-1:-1;;;60872:30:0;;;;;;;;;11320:6:1;11308:19;;;11290:38;;11278:2;11263:18;60872:30:0;11146:188:1;61130:30:0;;;;;;;;;;;;;;;;34320:279;;;;;;;;;;-1:-1:-1;34320:279:0;;;;;:::i;:::-;;:::i;64599:836::-;;;;;;:::i;:::-;;:::i;48636:43::-;;;;;;;;;;-1:-1:-1;48636:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35398:369;;;;;;;;;;-1:-1:-1;35398:369:0;;;;;:::i;:::-;;:::i;60828:37::-;;;;;;;;;;-1:-1:-1;60828:37:0;;;;-1:-1:-1;;;60828:37:0;;;;;;32878:320;;;;;;;;;;-1:-1:-1;32878:320:0;;;;;:::i;:::-;;:::i;68063:131::-;;;;;;;;;;-1:-1:-1;68063:131:0;;;;;:::i;:::-;;:::i;68669:92::-;;;;;;;;;;-1:-1:-1;68669:92:0;;;;;:::i;:::-;;:::i;61321:43::-;;;;;;;;;;-1:-1:-1;61321:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;34670:164;;;;;;;;;;-1:-1:-1;34670:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34791:25:0;;;34767:4;34791:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34670:164;48338:244;;;;;;;;;;-1:-1:-1;48338:244:0;;;;;:::i;:::-;;:::i;67635:201::-;;;;;;;;;;-1:-1:-1;67635:201:0;;;;;:::i;:::-;;:::i;29198:285::-;29300:4;-1:-1:-1;;;;;;29333:40:0;;-1:-1:-1;;;29333:40:0;;:97;;-1:-1:-1;;;;;;;29382:48:0;;-1:-1:-1;;;29382:48:0;29333:97;:142;;;-1:-1:-1;;;;;;;8327:33:0;;8303:4;8327:33;;;;;;;;;;;;;29439:36;29317:158;29198:285;-1:-1:-1;;29198:285:0:o;32534:100::-;32588:13;32621:5;32614:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32534:100;:::o;34044:204::-;34112:7;34137:16;34145:7;34137;:16::i;:::-;34132:64;;34162:34;;-1:-1:-1;;;34162:34:0;;;;;;;;;;;34132:64;-1:-1:-1;34216:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34216:24:0;;34044:204::o;33607:371::-;33680:13;33696:24;33712:7;33696:15;:24::i;:::-;33680:40;;33741:5;-1:-1:-1;;;;;33735:11:0;:2;-1:-1:-1;;;;;33735:11:0;;33731:48;;;33755:24;;-1:-1:-1;;;33755:24:0;;;;;;;;;;;33731:48;719:10;-1:-1:-1;;;;;33796:21:0;;;;;;:63;;-1:-1:-1;33822:37:0;33839:5;719:10;34670:164;:::i;33822:37::-;33821:38;33796:63;33792:138;;;33883:35;;-1:-1:-1;;;33883:35:0;;;;;;;;;;;33792:138;33942:28;33951:2;33955:7;33964:5;33942:8;:28::i;:::-;33669:309;33607:371;;:::o;69105:123::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;;;;;;;;;69193:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69105:123:::0;:::o;63822:769::-;48931:8;;;;;:13;48923:42;;;;-1:-1:-1;;;48923:42:0;;;;;;;:::i;:::-;48976:8;:12;;-1:-1:-1;;48976:12:0;;;63909:10:::1;48987:1:::0;63930:611:::1;63947:18:::0;;::::1;63930:611;;;63987:14;64012:7;;64020:1;64012:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64046:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;64004::::1;::::0;;::::1;::::0;-1:-1:-1;64046:36:0::1;::::0;64004:19;;64046:28:::1;:36;:::i;:::-;64038:70;;;::::0;-1:-1:-1;;;64038:70:0;;13946:2:1;64038:70:0::1;::::0;::::1;13928:21:1::0;13985:2;13965:18;;;13958:30;-1:-1:-1;;;14004:18:1;;;13997:51;14065:18;;64038:70:0::1;13744:345:1::0;64038:70:0::1;64150:6;::::0;64131:16:::1;::::0;;;64150:6:::1;64131:16;::::0;;;;;64159:15:::1;::::0;64131:25:::1;::::0;-1:-1:-1;;;64150:6:0;;::::1;;;::::0;64131:25:::1;:::i;:::-;:43;64123:69;;;::::0;-1:-1:-1;;;64123:69:0;;14561:2:1;64123:69:0::1;::::0;::::1;14543:21:1::0;14600:2;14580:18;;;14573:30;-1:-1:-1;;;14619:18:1;;;14612:43;14672:18;;64123:69:0::1;14359:337:1::0;64123:69:0::1;-1:-1:-1::0;;;;;64215:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;:34:::1;::::0;64242:6;64215:26:::1;:34::i;:::-;64207:59;;;::::0;-1:-1:-1;;;64207:59:0;;14903:2:1;64207:59:0::1;::::0;::::1;14885:21:1::0;14942:2;14922:18;;;14915:30;-1:-1:-1;;;14961:18:1;;;14954:42;15013:18;;64207:59:0::1;14701:336:1::0;64207:59:0::1;64288:16;::::0;;;:8:::1;:16;::::0;;;;64281:23;64334:13:::1;::::0;64325:22;::::1;64321:209;;;64368:52;::::0;-1:-1:-1;;;64368:52:0;;:4:::1;::::0;:21:::1;::::0;:52:::1;::::0;:4;;64405:6;;64413;;64368:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64321:209;;;64461:5;::::0;:53:::1;::::0;-1:-1:-1;;;64461:53:0;;-1:-1:-1;;;;;64461:5:0;;::::1;::::0;:22:::1;::::0;:53:::1;::::0;64492:4:::1;::::0;64499:6;;64507;;64461:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64321:209;-1:-1:-1::0;63967:3:0;::::1;::::0;::::1;:::i;:::-;;;;63930:611;;;;64556:27;64567:6;64575:7;;64556:27;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;49011:8:0;:12;;-1:-1:-1;;49011:12:0;49022:1;49011:12;;;-1:-1:-1;63822:769:0:o;68769:195::-;-1:-1:-1;;;68769:195:0;;;;;;;:::o;66612:262::-;-1:-1:-1;;;;;66708:17:0;;66697:8;66708:17;;;:11;:17;;;;;66668;;66697:8;66708:26;;:24;:26::i;:::-;66697:37;;66762:3;-1:-1:-1;;;;;66751:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66751:15:0;;66745:21;;66782:6;66777:90;66798:3;66794:1;:7;66777:90;;;-1:-1:-1;;;;;66832:17:0;;;;;;:11;:17;;;;;:23;;66853:1;66832:20;:23::i;:::-;66823:3;66827:1;66823:6;;;;;;;;:::i;:::-;;;;;;;;;;:32;66803:3;;;;:::i;:::-;;;;66777:90;;;;66686:188;66612:262;;;:::o;68972:125::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;69055:16:::1;:34:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;69055:34:0::1;-1:-1:-1::0;;;;69055:34:0;;::::1;::::0;;;::::1;::::0;;68972:125::o;28471:291::-;28717:12;;28172:1;28701:13;:28;-1:-1:-1;;28701:46:0;;28471:291::o;65443:536::-;48931:8;;;;;:13;48923:42;;;;-1:-1:-1;;;48923:42:0;;;;;;;:::i;:::-;48976:8;:12;;-1:-1:-1;;48976:12:0;;;;;;65517:11;::::1;48976:12:::0;65517:11:::1;:42:::0;::::1;;;-1:-1:-1::0;65550:8:0::1;::::0;-1:-1:-1;;;65550:8:0;::::1;;;65533:13;:11;:13::i;:::-;:25;;65517:42;65509:76;;;::::0;-1:-1:-1;;;65509:76:0;;16592:2:1;65509:76:0::1;::::0;::::1;16574:21:1::0;16631:2;16611:18;;;16604:30;-1:-1:-1;;;16650:18:1;;;16643:51;16711:18;;65509:76:0::1;16390:345:1::0;65509:76:0::1;65613:10;65596:14;65651:13;:11;:13::i;:::-;:17;::::0;65667:1:::1;65651:17;:::i;:::-;65696:19;::::0;65634:34;;-1:-1:-1;65696:19:0::1;-1:-1:-1::0;;;65696:19:0;;::::1;::::0;::::1;65687:28:::0;;::::1;;;65679:49;;;::::0;-1:-1:-1;;;65679:49:0;;16942:2:1;65679:49:0::1;::::0;::::1;16924:21:1::0;16981:1;16961:18;;;16954:29;-1:-1:-1;;;16999:18:1;;;16992:38;17047:18;;65679:49:0::1;16740:331:1::0;65679:49:0::1;65741:15;65767:5;65759:13;;:5;;:13;;;;:::i;:::-;65741:31;;65802:9;65791:7;:20;65783:42;;;::::0;-1:-1:-1;;;65783:42:0;;17451:2:1;65783:42:0::1;::::0;::::1;17433:21:1::0;17490:1;17470:18;;;17463:29;-1:-1:-1;;;17508:18:1;;;17501:39;17557:18;;65783:42:0::1;17249:332:1::0;65783:42:0::1;65836:14;::::0;:32:::1;::::0;-1:-1:-1;;;;;65836:14:0;;::::1;::::0;:32;::::1;;;::::0;65860:7;;65836:14:::1;:32:::0;:14;:32;65860:7;65836:14;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;65881:41:0::1;65887:6:::0;65881:41:::1;::::0;::::1;65912:1;65902:12;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;65902:12:0::1;;65916:5;65881;:41::i;:::-;65938:33;::::0;;-1:-1:-1;;;;;17802:32:1;;17784:51;;17866:2;17851:18;;17844:34;;;17926:4;17914:17;;17894:18;;;17887:45;65938:33:0;;::::1;::::0;;;;17772:2:1;65938:33:0;;::::1;-1:-1:-1::0;;49011:8:0;:12;;-1:-1:-1;;49011:12:0;49022:1;49011:12;;;-1:-1:-1;;65443:536:0:o;68353:100::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68425:8:::1;:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;68425:20:0::1;-1:-1:-1::0;;;;68425:20:0;;::::1;::::0;;;::::1;::::0;;68353:100::o;34901:170::-;35035:28;35045:4;35051:2;35055:7;35035:9;:28::i;61980:902::-;48931:8;;;;;:13;48923:42;;;;-1:-1:-1;;;48923:42:0;;;;;;;:::i;:::-;48976:8;:12;;-1:-1:-1;;48976:12:0;;;48987:1;62160:43:::1;62184:12:::0;62160:14;:43:::1;:::i;:::-;62232:10;62215:14;62427:13:::0;;;:5:::1;:13;::::0;;;;;;;;;62354:87;;-1:-1:-1;;18278:2:1;18274:15;;;18270:24;;62354:87:0;;::::1;18258:37:1::0;;;;62379:13:0::1;18311:12:1::0;;;18304:28;62402:4:0::1;18366:15:1::0;;;18362:24;;;18348:12;;;18341:46;-1:-1:-1;;;;;;18443:3:1;18421:16;;;18417:36;18403:12;;;18396:58;18470:12;;;18463:28;;;18507:13;;;18500:29;;;;62140:64:0;;-1:-1:-1;62232:10:0;62271:183:::1;::::0;18545:13:1;;62354:87:0::1;::::0;;-1:-1:-1;;62354:87:0;;::::1;::::0;;;;;;;62344:98;;62354:87:::1;62344:98:::0;;::::1;::::0;18811:66:1;62291:152:0;;::::1;18799:79:1::0;;;;18894:12;;;18887:28;18931:12;;62291:152:0::1;::::0;;-1:-1:-1;;62291:152:0;;::::1;::::0;;;;;;62281:163;;62291:152:::1;62281:163:::0;;::::1;::::0;62271:183:::1;::::0;;;;::::1;::::0;;;19181:25:1;19254:4;19242:17;;19222:18;;;19215:45;19276:18;;;19269:34;;;19319:18;;;19312:34;;;19153:19;;62271:183:0::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62271:183:0::1;::::0;-1:-1:-1;;62271:183:0;;62261:6:::1;::::0;;;::::1;-1:-1:-1::0;;;;;62261:6:0;;::::1;:193:::0;::::1;;::::0;-1:-1:-1;62253:210:0::1;;;;-1:-1:-1::0;;;62253:210:0::1;;;;;;19559:2:1::0;19541:21;;;19598:1;19578:18;;;19571:29;-1:-1:-1;;;19631:2:1;19616:18;;19609:34;19675:2;19660:18;;19357:327;62253:210:0::1;-1:-1:-1::0;;;;;62474:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;:15;;;::::1;::::0;::::1;:::i;:::-;;;;;;62555:34;62566:6;62574:14;;62555:10;:34::i;:::-;62600:31;62610:6;62618:12;;62600:9;:31::i;:::-;62679:15;::::0;62644:9:::1;::::0;:62:::1;::::0;-1:-1:-1;;;;;62644:9:0;;::::1;::::0;62671:6;;62679:15:::1;62696:9:::0;62644:26:::1;:62::i;:::-;62736:5;::::0;:20:::1;::::0;;-1:-1:-1;;;62736:20:0;;;;62719:14:::1;::::0;-1:-1:-1;;;;;62736:5:0::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:20:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62767:5;::::0;:25:::1;::::0;-1:-1:-1;;;62767:25:0;;-1:-1:-1;;;;;20068:32:1;;;62767:25:0::1;::::0;::::1;20050:51:1::0;20149:4;20137:17;;20117:18;;;20110:45;62719:37:0;;-1:-1:-1;62767:5:0;::::1;::::0;:10:::1;::::0;20023:18:1;;62767:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62808:66;62818:6;62826;62834:9;62845:14;;62861:12;;62808:66;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;49011:8:0;:12;;-1:-1:-1;;49011:12:0;49022:1;49011:12;;;-1:-1:-1;;;;;;;;;61980:902:0:o;66468:136::-;-1:-1:-1;;;;;66565:17:0;;66542:4;66565:17;;;:11;:17;;;;;:31;;66586:9;66565:20;:31::i;:::-;66558:38;66468:136;-1:-1:-1;;;66468:136:0:o;66114:119::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;66200:25:::1;66212:12;66200:11;:25::i;:::-;66114:119:::0;:::o;65987:::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;66061:37:::1;66067:2:::0;66071:5;66088:1:::1;66078:12;::::0;35142:185;35280:39;35297:4;35303:2;35307:7;35280:39;;;;;;;;;;;;:16;:39::i;68202:143::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68295:19:::1;:42:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;68295:42:0::1;-1:-1:-1::0;;;;68295:42:0;;::::1;::::0;;;::::1;::::0;;68202:143::o;49039:145::-;47463:6;;-1:-1:-1;;;;;47463:6:0;719:10;47608:23;47600:68;;;;-1:-1:-1;;;47600:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49113:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;;:24;;-1:-1:-1;;49113:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49153:23;;21455:51:1;;;21522:18;;;21515:50;49153:23:0::1;::::0;21428:18:1;49153:23:0::1;;;;;;;49039:145:::0;;:::o;32288:179::-;32352:7;32380:16;32388:7;32380;:16::i;:::-;32372:44;;;;-1:-1:-1;;;32372:44:0;;21778:2:1;32372:44:0;;;21760:21:1;21817:2;21797:18;;;21790:30;-1:-1:-1;;;21836:18:1;;;21829:45;21891:18;;32372:44:0;21576:339:1;32372:44:0;32434:20;32446:7;32434:11;:20::i;:::-;:25;;32288:179;-1:-1:-1;;32288:179:0:o;61099:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66341:119::-;-1:-1:-1;;;;;66426:17:0;;66403:4;66426:17;;;:11;:17;;;;;:26;;:24;:26::i;67844:93::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;67913:6:::1;:16:::0;;-1:-1:-1;;;;;67913:16:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;67913:16:0;;::::1;::::0;;;::::1;::::0;;67844:93::o;66882:648::-;-1:-1:-1;;;;;66977:17:0;;66966:8;66977:17;;;:11;:17;;;;;66937;;66966:8;66977:26;;:24;:26::i;:::-;66966:37;;67014:18;67046:3;-1:-1:-1;;;;;67035:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67035:15:0;-1:-1:-1;67014:36:0;-1:-1:-1;67061:10:0;;67082:229;67103:3;67099:1;:7;67082:229;;;-1:-1:-1;;;;;67140:17:0;;67128:9;67140:17;;;:11;:17;;;;;:23;;67161:1;67140:20;:23::i;:::-;67199:6;;67182:14;;;;67199:6;67182:14;;;;;;;;-1:-1:-1;67208:15:0;;67182:23;;-1:-1:-1;;;67199:6:0;;;;;67182:23;:::i;:::-;:41;67178:122;;;67254:4;67244;67249:1;67244:7;;;;;;;;:::i;:::-;;;;;;;;;;:14;67277:7;;;;:::i;:::-;;;;67178:122;-1:-1:-1;67108:3:0;;;;:::i;:::-;;;;67082:229;;;;67338:5;-1:-1:-1;;;;;67327:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67327:17:0;;67321:23;;67355:6;67381;67376:147;67397:3;67393:1;:7;67376:147;;;67436:1;67426:4;67431:1;67426:7;;;;;;;;:::i;:::-;;;;;;;:11;67422:90;;;67467:4;67472:1;67467:7;;;;;;;;:::i;:::-;;;;;;;67458:3;67462:1;67458:6;;;;;;;;:::i;:::-;;;;;;;;;;:16;67493:3;;;;:::i;:::-;;;;67422:90;67402:3;;;;:::i;:::-;;;;67376:147;;;;66955:575;;;;66882:648;;;:::o;49192:104::-;-1:-1:-1;;;;;49271:17:0;49247:4;49271:17;;;:11;:17;;;;;;;;;49192:104::o;29547:206::-;29611:7;-1:-1:-1;;;;;29635:19:0;;29631:60;;29663:28;;-1:-1:-1;;;29663:28:0;;;;;;;;;;;29631:60;-1:-1:-1;;;;;;29717:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29717:27:0;;29547:206::o;66241:92::-;66284:13;66316:9;:7;:9::i;:::-;66309:16;;66241:92;:::o;48037:148::-;47463:6;;-1:-1:-1;;;;;47463:6:0;719:10;47608:23;47600:68;;;;-1:-1:-1;;;47600:68:0;;;;;;;:::i;:::-;48128:6:::1;::::0;48107:40:::1;::::0;48144:1:::1;::::0;-1:-1:-1;;;;;48128:6:0::1;::::0;48107:40:::1;::::0;48144:1;;48107:40:::1;48158:6;:19:::0;;-1:-1:-1;;;;;;48158:19:0::1;::::0;;48037:148::o;68557:104::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68631:9:::1;:22:::0;;-1:-1:-1;;;;;;68631:22:0::1;-1:-1:-1::0;;;;;68631:22:0;;;::::1;::::0;;;::::1;::::0;;68557:104::o;67945:110::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68021:11:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;68021:26:0;;::::1;::::0;;;::::1;::::0;;67945:110::o;67538:89::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;67605:5:::1;:14:::0;67538:89::o;68461:88::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68527:5:::1;:14:::0;;-1:-1:-1;;;;;;68527:14:0::1;-1:-1:-1::0;;;;;68527:14:0;;;::::1;::::0;;;::::1;::::0;;68461:88::o;32703:104::-;32759:13;32792:7;32785:14;;;;;:::i;34320:279::-;-1:-1:-1;;;;;34411:24:0;;719:10;34411:24;34407:54;;;34444:17;;-1:-1:-1;;;34444:17:0;;;;;;;;;;;34407:54;719:10;34474:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34474:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34474:53:0;;;;;;;;;;34543:48;;540:41:1;;;34474:42:0;;719:10;34543:48;;513:18:1;34543:48:0;;;;;;;34320:279;;:::o;64599:836::-;48931:8;;;;;:13;48923:42;;;;-1:-1:-1;;;48923:42:0;;;;;;;:::i;:::-;48976:8;:12;;-1:-1:-1;;48976:12:0;;;;;;64702:11;::::1;48976:12:::0;64702:11:::1;64701:12;:43:::0;::::1;;;-1:-1:-1::0;64735:8:0::1;::::0;-1:-1:-1;;;64735:8:0;::::1;;;64718:13;:11;:13::i;:::-;:25;;64701:43;64693:78;;;::::0;-1:-1:-1;;;64693:78:0;;22122:2:1;64693:78:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;-1:-1:-1;;;22180:18:1;;;22173:52;22242:18;;64693:78:0::1;21920:346:1::0;64693:78:0::1;64870:16;::::0;64801:10:::1;64784:14;64836:21:::0;;;:13:::1;:21;::::0;;;;;64801:10;;-1:-1:-1;;;64870:16:0;::::1;;;::::0;64830:36:::1;::::0;64861:5;;64830:36:::1;:::i;:::-;:56;;;;64822:75;;;::::0;-1:-1:-1;;;64822:75:0;;22682:2:1;64822:75:0::1;::::0;::::1;22664:21:1::0;22721:1;22701:18;;;22694:29;-1:-1:-1;;;22739:18:1;;;22732:36;22785:18;;64822:75:0::1;22480:329:1::0;64822:75:0::1;65011:61;::::0;-1:-1:-1;;23093:2:1;23089:15;;;23085:24;;65011:61:0::1;::::0;::::1;23073:37:1::0;65036:13:0::1;23126:12:1::0;;;23119:28;65059:4:0::1;23181:15:1::0;;23177:24;23163:12;;;23156:46;-1:-1:-1;;;;;;23258:3:1;23236:16;;;23232:36;23218:12;;;23211:58;64928:157:0::1;::::0;23285:12:1;;65011:61:0::1;::::0;;-1:-1:-1;;65011:61:0;;::::1;::::0;;;;;;;65001:72;;65011:61:::1;65001:72:::0;;::::1;::::0;18811:66:1;64948:126:0;;::::1;18799:79:1::0;;;;18894:12;;;18887:28;18931:12;;64948:126:0::1;::::0;;-1:-1:-1;;64948:126:0;;::::1;::::0;;;;;;64938:137;;64948:126:::1;64938:137:::0;;::::1;::::0;64928:157:::1;::::0;;;;::::1;::::0;;;19181:25:1;19254:4;19242:17;;19222:18;;;19215:45;19276:18;;;19269:34;;;19319:18;;;19312:34;;;19153:19;;64928:157:0::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;64928:157:0::1;::::0;-1:-1:-1;;64928:157:0;;64918:6:::1;::::0;;;::::1;-1:-1:-1::0;;;;;64918:6:0;;::::1;:167:::0;::::1;;::::0;-1:-1:-1;64910:184:0::1;;;;-1:-1:-1::0;;;64910:184:0::1;;;;;;19559:2:1::0;19541:21;;;19598:1;19578:18;;;19571:29;-1:-1:-1;;;19631:2:1;19616:18;;19609:34;19675:2;19660:18;;19357:327;64910:184:0::1;-1:-1:-1::0;;;;;65107:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;:39;;65132:14:::1;::::0;::::1;::::0;65107:21;:39:::1;::::0;65132:14;;65107:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;65175:5:0::1;::::0;65157:15:::1;::::0;65175:13:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;65157:31;;65218:9;65207:7;:20;65199:42;;;::::0;-1:-1:-1;;;65199:42:0;;17451:2:1;65199:42:0::1;::::0;::::1;17433:21:1::0;17490:1;17470:18;;;17463:29;-1:-1:-1;;;17508:18:1;;;17501:39;17557:18;;65199:42:0::1;17249:332:1::0;65199:42:0::1;65252:14;::::0;:32:::1;::::0;-1:-1:-1;;;;;65252:14:0;;::::1;::::0;:32;::::1;;;::::0;65276:7;;65252:14:::1;:32:::0;:14;:32;65276:7;65252:14;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65295:14;65312:13;:11;:13::i;:::-;:17;::::0;65328:1:::1;65312:17;:::i;:::-;65295:34:::0;-1:-1:-1;65340:41:0::1;65346:6:::0;65340:41:::1;::::0;::::1;65371:1;65361:12;::::0;65340:41:::1;65397:30;::::0;;-1:-1:-1;;;;;17802:32:1;;17784:51;;17866:2;17851:18;;17844:34;;;17926:4;17914:17;;17894:18;;;17887:45;65397:30:0;;::::1;::::0;;;;17772:2:1;65397:30:0;;::::1;-1:-1:-1::0;;49011:8:0;:12;;-1:-1:-1;;49011:12:0;49022:1;49011:12;;;-1:-1:-1;;;;;64599:836:0:o;35398:369::-;35565:28;35575:4;35581:2;35585:7;35565:9;:28::i;:::-;-1:-1:-1;;;;;35608:13:0;;17377:20;17415:8;;35608:76;;;;;35628:56;35659:4;35665:2;35669:7;35678:5;35628:30;:56::i;:::-;35627:57;35608:76;35604:156;;;35708:40;;-1:-1:-1;;;35708:40:0;;;;;;;;;;;35604:156;35398:369;;;;:::o;32878:320::-;32951:13;32982:16;32990:7;32982;:16::i;:::-;32977:59;;33007:29;;-1:-1:-1;;;33007:29:0;;;;;;;;;;;32977:59;33049:22;33074:9;:7;:9::i;:::-;33049:34;;33107:8;33101:22;33127:1;33101:27;;:89;;;;;;;;;;;;;;;;;33155:8;33165:18;:7;:16;:18::i;:::-;33138:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33094:96;32878:320;-1:-1:-1;;;32878:320:0:o;68063:131::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68150:16:::1;:36:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;68150:36:0::1;-1:-1:-1::0;;;;68150:36:0;;::::1;::::0;;;::::1;::::0;;68063:131::o;68669:92::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;68737:6:::1;:16:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;68737:16:0::1;-1:-1:-1::0;;;;68737:16:0;;::::1;::::0;;;::::1;::::0;;68669:92::o;48338:244::-;47463:6;;-1:-1:-1;;;;;47463:6:0;719:10;47608:23;47600:68;;;;-1:-1:-1;;;47600:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48427:22:0;::::1;48419:73;;;::::0;-1:-1:-1;;;48419:73:0;;24344:2:1;48419:73:0::1;::::0;::::1;24326:21:1::0;24383:2;24363:18;;;24356:30;24422:34;24402:18;;;24395:62;-1:-1:-1;;;24473:18:1;;;24466:36;24519:19;;48419:73:0::1;24142:402:1::0;48419:73:0::1;48529:6;::::0;48508:38:::1;::::0;-1:-1:-1;;;;;48508:38:0;;::::1;::::0;48529:6:::1;::::0;48508:38:::1;::::0;48529:6:::1;::::0;48508:38:::1;48557:6;:17:::0;;-1:-1:-1;;;;;;48557:17:0::1;-1:-1:-1::0;;;;;48557:17:0;;;::::1;::::0;;;::::1;::::0;;48338:244::o;67635:201::-;48815:22;48826:10;48815;:22::i;:::-;48807:61;;;;-1:-1:-1;;;48807:61:0;;;;;;;:::i;:::-;67751:14:::1;:32:::0;;-1:-1:-1;;;;;67751:32:0;;::::1;-1:-1:-1::0;;;;;;67751:32:0;;::::1;;::::0;;;67794:15:::1;:34:::0;;;;;::::1;::::0;::::1;;::::0;;67635:201::o;36022:183::-;36079:4;36122:7;28172:1;36103:26;;:53;;;;;36143:13;;36133:7;:23;36103:53;:94;;;;-1:-1:-1;;36170:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36170:27:0;;;;36169:28;;36022:183::o;43399:196::-;43514:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43514:29:0;-1:-1:-1;;;;;43514:29:0;;;;;;;;;43559:28;;43514:24;;43559:28;;;;;;;43399:196;;;:::o;59281:146::-;59358:4;54432:19;;;:12;;;:19;;;;;;:24;;59382:37;54335:129;59058:137;59128:4;59152:35;59160:3;59180:5;59152:7;:35::i;59513:114::-;59573:7;59600:19;59608:3;54633:18;;54550:109;59973:137;60044:7;60079:22;60083:3;60095:5;60079:3;:22::i;37102:1709::-;37264:13;;-1:-1:-1;;;;;37292:16:0;;37288:48;;37317:19;;-1:-1:-1;;;37317:19:0;;;;;;;;;;;37288:48;37351:13;37347:44;;37373:18;;-1:-1:-1;;;37373:18:0;;;;;;;;;;;37347:44;-1:-1:-1;;;;;37734:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37789:49:0;;-1:-1:-1;;;;;37734:44:0;;;;;;;37789:49;;;;-1:-1:-1;;37734:44:0;;;;;;37789:49;;;;;;;;;;;;;;;;37851:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37897:66:0;;;;-1:-1:-1;;;37947:15:0;37897:66;;;;;;;;;;37851:25;38036:23;;;38076:4;:23;;;;-1:-1:-1;;;;;;38084:13:0;;17377:20;17415:8;;38084:15;38072:615;;;38116:307;38143:38;;38168:12;;-1:-1:-1;;;;;38143:38:0;;;38160:1;;38143:38;;38160:1;;38143:38;38205:69;38244:1;38248:2;38252:14;;;;;;38268:5;38205:30;:69::i;:::-;38200:166;;38306:40;;-1:-1:-1;;;38306:40:0;;;;;;;;;;;38200:166;38418:3;38402:12;:19;;38116:307;;38496:12;38479:13;;:29;38475:43;;38510:8;;;38475:43;38072:615;;;38551:125;38578:40;;38603:14;;;;;-1:-1:-1;;;;;38578:40:0;;;38595:1;;38578:40;;38595:1;;38578:40;38671:3;38655:12;:19;;38551:125;;38072:615;-1:-1:-1;38697:13:0;:28;38743:60;37230:1581;37102:1709;;;;:::o;39065:2036::-;39180:35;39218:20;39230:7;39218:11;:20::i;:::-;39293:18;;39180:58;;-1:-1:-1;39251:22:0;;-1:-1:-1;;;;;39277:34:0;719:10;-1:-1:-1;;;;;39277:34:0;;:97;;;-1:-1:-1;39341:18:0;;39324:50;;719:10;34670:164;:::i;39324:50::-;39277:146;;;-1:-1:-1;719:10:0;39387:20;39399:7;39387:11;:20::i;:::-;-1:-1:-1;;;;;39387:36:0;;39277:146;39251:173;;39442:17;39437:66;;39468:35;;-1:-1:-1;;;39468:35:0;;;;;;;;;;;39437:66;39540:4;-1:-1:-1;;;;;39518:26:0;:13;:18;;;-1:-1:-1;;;;;39518:26:0;;39514:67;;39553:28;;-1:-1:-1;;;39553:28:0;;;;;;;;;;;39514:67;-1:-1:-1;;;;;39596:16:0;;39592:52;;39621:23;;-1:-1:-1;;;39621:23:0;;;;;;;;;;;39592:52;39765:49;39782:1;39786:7;39795:13;:18;;;39765:8;:49::i;:::-;-1:-1:-1;;;;;40102:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40102:31:0;;;-1:-1:-1;;;;;40102:31:0;;;-1:-1:-1;;40102:31:0;;;;;;;40144:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40144:29:0;;;;;;;;;;;40186:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;40227:61:0;;;;-1:-1:-1;;;40272:15:0;40227:61;;;;;;;;;;;40550:11;;;40576:24;;;;;:29;40550:11;;40576:29;40572:417;;40789:13;;40775:11;:27;40771:207;;;40855:18;;;40823:24;;;:11;:24;;;;;;;;:50;;40934:28;;;;-1:-1:-1;;;;;40892:70:0;-1:-1:-1;;;40892:70:0;-1:-1:-1;;;;;;40892:70:0;;;-1:-1:-1;;;;;40823:50:0;;;40892:70;;;;;;;40771:207;40081:915;41032:7;41028:2;-1:-1:-1;;;;;41013:27:0;41022:4;-1:-1:-1;;;;;41013:27:0;;;;;;;;;;;41051:42;35398:369;63302:512;63389:9;63384:423;63404:18;;;63384:423;;;63444:14;63469:7;;63477:1;63469:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63461:19;;63444:36;;63508:13;;63499:6;:22;63495:204;;;63542:47;63559:6;63575:4;63582:6;63542:16;:47::i;:::-;63495:204;;;63630:5;;:53;;-1:-1:-1;;;63630:53:0;;-1:-1:-1;;;;;63630:5:0;;;;:22;;:53;;63653:6;;63669:4;;63676:6;;63630:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63495:204;-1:-1:-1;;;;;63715:19:0;;;;;;:11;:19;;;;;:31;;63739:6;63715:23;:31::i;:::-;-1:-1:-1;63761:16:0;;;;:8;:16;;;;;63780:15;63761:34;;63424:3;;;;:::i;:::-;;;;63384:423;;62890:404;62976:6;62971:316;62988:18;;;62971:316;;;63028:12;63051:7;;63059:1;63051:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63085:19:0;;;;;;:11;:19;;;;;63043;;;;;-1:-1:-1;63085:34:0;;63043:19;;63085:28;:34;:::i;:::-;63077:54;;;;-1:-1:-1;;;63077:54:0;;24751:2:1;63077:54:0;;;24733:21:1;24790:1;24770:18;;;24763:29;-1:-1:-1;;;24808:18:1;;;24801:37;24855:18;;63077:54:0;24549:330:1;63077:54:0;63172:6;;63155:14;;;;63172:6;63155:14;;;;;;63154:51;63189:15;63154:51;;;63155:23;;-1:-1:-1;;;63172:6:0;;;;;;;63155:23;:::i;:::-;63154:51;63146:74;;;;-1:-1:-1;;;63146:74:0;;25086:2:1;63146:74:0;;;25068:21:1;25125:2;25105:18;;;25098:30;-1:-1:-1;;;25144:18:1;;;25137:40;25194:18;;63146:74:0;24884:334:1;63146:74:0;63235:14;;;;:8;:14;;;;;:40;63259:15;63235:40;;;63008:3;;;;:::i;:::-;;;;62971:316;;49830:248;49974:96;49994:5;50024:27;;;50053:4;50059:2;50063:5;50001:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50001:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;50001:68:0;-1:-1:-1;;;;;;50001:68:0;;;;;;;;;;49974:19;:96::i;28189:100::-;28262:19;;;;:8;;:19;;;;;:::i;31202:1024::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31312:7:0;;28172:1;31353:23;;:47;;;;;31387:13;;31380:4;:20;31353:47;31349:814;;;31417:31;31451:17;;;:11;:17;;;;;;;;;31417:51;;;;;;;;;-1:-1:-1;;;;;31417:51:0;;;;-1:-1:-1;;;31417:51:0;;-1:-1:-1;;;;;31417:51:0;;;;;;;;-1:-1:-1;;;31417:51:0;;;;;;;;;;;;;;31483:669;;31529:14;;-1:-1:-1;;;;;31529:28:0;;31525:93;;31589:9;31202:1024;-1:-1:-1;;;31202:1024:0:o;31525:93::-;-1:-1:-1;;;31936:6:0;31977:17;;;;:11;:17;;;;;;;;;31965:29;;;;;;;;;-1:-1:-1;;;;;31965:29:0;;;;;-1:-1:-1;;;31965:29:0;;-1:-1:-1;;;;;31965:29:0;;;;;;;;-1:-1:-1;;;31965:29:0;;;;;;;;;;;;;32021:28;32017:101;;32085:9;31202:1024;-1:-1:-1;;;31202:1024:0:o;32017:101::-;31900:237;;;31402:761;31349:814;32187:31;;-1:-1:-1;;;32187:31:0;;;;;;;;;;;33446:99;33496:13;33529:8;33522:15;;;;;:::i;44087:667::-;44271:72;;-1:-1:-1;;;44271:72:0;;44250:4;;-1:-1:-1;;;;;44271:36:0;;;;;:72;;719:10;;44322:4;;44328:7;;44337:5;;44271:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44271:72:0;;;;;;;;-1:-1:-1;;44271:72:0;;;;;;;;;;;;:::i;:::-;;;44267:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44505:13:0;;44501:235;;44551:40;;-1:-1:-1;;;44551:40:0;;;;;;;;;;;44501:235;44694:6;44688:13;44679:6;44675:2;44671:15;44664:38;44267:480;-1:-1:-1;;;;;;44390:55:0;-1:-1:-1;;;44390:55:0;;-1:-1:-1;44383:62:0;;24391:721;24447:13;24666:10;24662:53;;-1:-1:-1;;24693:10:0;;;;;;;;;;;;-1:-1:-1;;;24693:10:0;;;;;24391:721::o;24662:53::-;24740:5;24725:12;24781:78;24788:9;;24781:78;;24814:8;;;;:::i;:::-;;-1:-1:-1;24837:10:0;;-1:-1:-1;24845:2:0;24837:10;;:::i;:::-;;;24781:78;;;24869:19;24901:6;-1:-1:-1;;;;;24891:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24891:17:0;;24869:39;;24919:154;24926:10;;24919:154;;24953:11;24963:1;24953:11;;:::i;:::-;;-1:-1:-1;25022:10:0;25030:2;25022:5;:10;:::i;:::-;25009:24;;:2;:24;:::i;:::-;24996:39;;24979:6;24986;24979:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24979:56:0;;;;;;;;-1:-1:-1;25050:11:0;25059:2;25050:11;;:::i;:::-;;;24919:154;;52693:1556;52759:4;52898:19;;;:12;;;:19;;;;;;52934:15;;52930:1312;;53295:21;53319:14;53332:1;53319:10;:14;:::i;:::-;53368:18;;53295:38;;-1:-1:-1;53348:17:0;;53368:22;;53389:1;;53368:22;:::i;:::-;53348:42;;53635:17;53655:3;:11;;53667:9;53655:22;;;;;;;;:::i;:::-;;;;;;;;;53635:42;;53801:9;53772:3;:11;;53784:13;53772:26;;;;;;;;:::i;:::-;;;;;;;;;;:38;53904:17;:13;53920:1;53904:17;:::i;:::-;53878:23;;;;:12;;;:23;;;;;:43;54043:17;;53878:3;;54043:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;54138:3;:12;;:19;54151:5;54138:19;;;;;;;;;;;54131:26;;;54181:4;54174:11;;;;;;;;52930:1312;54225:5;54218:12;;;;;55005:204;55100:18;;55072:7;;55100:26;-1:-1:-1;55092:73:0;;;;-1:-1:-1;;;55092:73:0;;26809:2:1;55092:73:0;;;26791:21:1;26848:2;26828:18;;;26821:30;26887:34;26867:18;;;26860:62;-1:-1:-1;;;26938:18:1;;;26931:32;26980:19;;55092:73:0;26607:398:1;55092:73:0;55183:3;:11;;55195:5;55183:18;;;;;;;;:::i;:::-;;;;;;;;;55176:25;;55005:204;;;;:::o;58751:131::-;58818:4;58842:32;58847:3;58867:5;58842:4;:32::i;50469:716::-;50893:23;50919:69;50947:4;50919:69;;;;;;;;;;;;;;;;;50927:5;-1:-1:-1;;;;;50919:27:0;;;:69;;;;;:::i;:::-;51003:17;;50893:95;;-1:-1:-1;51003:21:0;50999:179;;51100:10;51089:30;;;;;;;;;;;;:::i;:::-;51081:85;;;;-1:-1:-1;;;51081:85:0;;27462:2:1;51081:85:0;;;27444:21:1;27501:2;27481:18;;;27474:30;27540:34;27520:18;;;27513:62;-1:-1:-1;;;27591:18:1;;;27584:40;27641:19;;51081:85:0;27260:406:1;52103:414:0;52166:4;54432:19;;;:12;;;:19;;;;;;52183:327;;-1:-1:-1;52226:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;52409:18;;52387:19;;;:12;;;:19;;;;;;:40;;;;52442:11;;52183:327;-1:-1:-1;52493:5:0;52486:12;;19919:195;20022:12;20054:52;20076:6;20084:4;20090:1;20093:12;20022;17377:20;;21211:60;;;;-1:-1:-1;;;21211:60:0;;28280:2:1;21211:60:0;;;28262:21:1;28319:2;28299:18;;;28292:30;28358:31;28338:18;;;28331:59;28407:18;;21211:60:0;28078:353:1;21211:60:0;21343:12;21357:23;21384:6;-1:-1:-1;;;;;21384:11:0;21404:5;21411:4;21384:32;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21342:74;;;;21434:52;21452:7;21461:10;21473:12;21434:17;:52::i;:::-;21427:59;20967:527;-1:-1:-1;;;;;;;20967:527:0:o;23492:741::-;23608:12;23637:7;23633:593;;;-1:-1:-1;23668:10:0;23661:17;;23633:593;23782:17;;:21;23778:437;;24043:10;24037:17;24104:15;24091:10;24087:2;24083:19;24076:44;23778:437;24186:12;24179:20;;-1:-1:-1;;;24179:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2389:247::-;2448:6;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2556:9;2543:23;2575:31;2600:5;2575:31;:::i;2823:127::-;2884:10;2879:3;2875:20;2872:1;2865:31;2915:4;2912:1;2905:15;2939:4;2936:1;2929:15;2955:632;3020:5;-1:-1:-1;;;;;3091:2:1;3083:6;3080:14;3077:40;;;3097:18;;:::i;:::-;3172:2;3166:9;3140:2;3226:15;;-1:-1:-1;;3222:24:1;;;3248:2;3218:33;3214:42;3202:55;;;3272:18;;;3292:22;;;3269:46;3266:72;;;3318:18;;:::i;:::-;3358:10;3354:2;3347:22;3387:6;3378:15;;3417:6;3409;3402:22;3457:3;3448:6;3443:3;3439:16;3436:25;3433:45;;;3474:1;3471;3464:12;3433:45;3524:6;3519:3;3512:4;3504:6;3500:17;3487:44;3579:1;3572:4;3563:6;3555;3551:19;3547:30;3540:41;;;;2955:632;;;;;:::o;3592:451::-;3661:6;3714:2;3702:9;3693:7;3689:23;3685:32;3682:52;;;3730:1;3727;3720:12;3682:52;3770:9;3757:23;-1:-1:-1;;;;;3795:6:1;3792:30;3789:50;;;3835:1;3832;3825:12;3789:50;3858:22;;3911:4;3903:13;;3899:27;-1:-1:-1;3889:55:1;;3940:1;3937;3930:12;3889:55;3963:74;4029:7;4024:2;4011:16;4006:2;4002;3998:11;3963:74;:::i;4048:366::-;4110:8;4120:6;4174:3;4167:4;4159:6;4155:17;4151:27;4141:55;;4192:1;4189;4182:12;4141:55;-1:-1:-1;4215:20:1;;-1:-1:-1;;;;;4247:30:1;;4244:50;;;4290:1;4287;4280:12;4244:50;4327:4;4319:6;4315:17;4303:29;;4387:3;4380:4;4370:6;4367:1;4363:14;4355:6;4351:27;4347:38;4344:47;4341:67;;;4404:1;4401;4394:12;4341:67;4048:366;;;;;:::o;4419:435::-;4504:6;4512;4565:2;4553:9;4544:7;4540:23;4536:32;4533:52;;;4581:1;4578;4571:12;4533:52;4621:9;4608:23;-1:-1:-1;;;;;4646:6:1;4643:30;4640:50;;;4686:1;4683;4676:12;4640:50;4725:69;4786:7;4777:6;4766:9;4762:22;4725:69;:::i;:::-;4813:8;;4699:95;;-1:-1:-1;4419:435:1;-1:-1:-1;;;;4419:435:1:o;4859:795::-;4954:6;4962;4970;4978;5031:3;5019:9;5010:7;5006:23;5002:33;4999:53;;;5048:1;5045;5038:12;4999:53;5087:9;5074:23;5106:31;5131:5;5106:31;:::i;:::-;5156:5;-1:-1:-1;5213:2:1;5198:18;;5185:32;5226:33;5185:32;5226:33;:::i;:::-;5278:7;-1:-1:-1;5332:2:1;5317:18;;5304:32;;-1:-1:-1;5387:2:1;5372:18;;5359:32;-1:-1:-1;;;;;5403:30:1;;5400:50;;;5446:1;5443;5436:12;5400:50;5469:22;;5522:4;5514:13;;5510:27;-1:-1:-1;5500:55:1;;5551:1;5548;5541:12;5500:55;5574:74;5640:7;5635:2;5622:16;5617:2;5613;5609:11;5574:74;:::i;:::-;5564:84;;;4859:795;;;;;;;:::o;5866:632::-;6037:2;6089:21;;;6159:13;;6062:18;;;6181:22;;;6008:4;;6037:2;6260:15;;;;6234:2;6219:18;;;6008:4;6303:169;6317:6;6314:1;6311:13;6303:169;;;6378:13;;6366:26;;6447:15;;;;6412:12;;;;6339:1;6332:9;6303:169;;;-1:-1:-1;6489:3:1;;5866:632;-1:-1:-1;;;;;;5866:632:1:o;6503:163::-;6570:20;;6630:10;6619:22;;6609:33;;6599:61;;6656:1;6653;6646:12;6599:61;6503:163;;;:::o;6671:184::-;6729:6;6782:2;6770:9;6761:7;6757:23;6753:32;6750:52;;;6798:1;6795;6788:12;6750:52;6821:28;6839:9;6821:28;:::i;7083:156::-;7149:20;;7209:4;7198:16;;7188:27;;7178:55;;7229:1;7226;7219:12;7244:182;7301:6;7354:2;7342:9;7333:7;7329:23;7325:32;7322:52;;;7370:1;7367;7360:12;7322:52;7393:27;7410:9;7393:27;:::i;7654:272::-;7712:6;7765:2;7753:9;7744:7;7740:23;7736:32;7733:52;;;7781:1;7778;7771:12;7733:52;7820:9;7807:23;7870:6;7863:5;7859:18;7852:5;7849:29;7839:57;;7892:1;7889;7882:12;7931:456;8008:6;8016;8024;8077:2;8065:9;8056:7;8052:23;8048:32;8045:52;;;8093:1;8090;8083:12;8045:52;8132:9;8119:23;8151:31;8176:5;8151:31;:::i;:::-;8201:5;-1:-1:-1;8258:2:1;8243:18;;8230:32;8271:33;8230:32;8271:33;:::i;:::-;7931:456;;8323:7;;-1:-1:-1;;;8377:2:1;8362:18;;;;8349:32;;7931:456::o;8392:1046::-;8546:6;8554;8562;8570;8578;8586;8594;8602;8655:3;8643:9;8634:7;8630:23;8626:33;8623:53;;;8672:1;8669;8662:12;8623:53;8712:9;8699:23;-1:-1:-1;;;;;8782:2:1;8774:6;8771:14;8768:34;;;8798:1;8795;8788:12;8768:34;8837:69;8898:7;8889:6;8878:9;8874:22;8837:69;:::i;:::-;8925:8;;-1:-1:-1;8811:95:1;-1:-1:-1;9013:2:1;8998:18;;8985:32;;-1:-1:-1;9029:16:1;;;9026:36;;;9058:1;9055;9048:12;9026:36;;9097:71;9160:7;9149:8;9138:9;9134:24;9097:71;:::i;:::-;9187:8;;-1:-1:-1;9071:97:1;-1:-1:-1;;9269:2:1;9254:18;;9241:32;;-1:-1:-1;9320:2:1;9305:18;;9292:32;;-1:-1:-1;9343:37:1;9375:3;9360:19;;9343:37;:::i;:::-;9333:47;;9427:3;9416:9;9412:19;9399:33;9389:43;;8392:1046;;;;;;;;;;;:::o;9856:118::-;9942:5;9935:13;9928:21;9921:5;9918:32;9908:60;;9964:1;9961;9954:12;9979:382;10044:6;10052;10105:2;10093:9;10084:7;10080:23;10076:32;10073:52;;;10121:1;10118;10111:12;10073:52;10160:9;10147:23;10179:31;10204:5;10179:31;:::i;:::-;10229:5;-1:-1:-1;10286:2:1;10271:18;;10258:32;10299:30;10258:32;10299:30;:::i;:::-;10348:7;10338:17;;;9979:382;;;;;:::o;10633:241::-;10689:6;10742:2;10730:9;10721:7;10717:23;10713:32;10710:52;;;10758:1;10755;10748:12;10710:52;10797:9;10784:23;10816:28;10838:5;10816:28;:::i;11339:389::-;11421:6;11429;11437;11445;11498:3;11486:9;11477:7;11473:23;11469:33;11466:53;;;11515:1;11512;11505:12;11466:53;11551:9;11538:23;11528:33;;11608:2;11597:9;11593:18;11580:32;11570:42;;11631:36;11663:2;11652:9;11648:18;11631:36;:::i;:::-;11621:46;;11686:36;11718:2;11707:9;11703:18;11686:36;:::i;:::-;11676:46;;11339:389;;;;;;;:::o;11733:388::-;11801:6;11809;11862:2;11850:9;11841:7;11837:23;11833:32;11830:52;;;11878:1;11875;11868:12;11830:52;11917:9;11904:23;11936:31;11961:5;11936:31;:::i;:::-;11986:5;-1:-1:-1;12043:2:1;12028:18;;12015:32;12056:33;12015:32;12056:33;:::i;12527:380::-;12606:1;12602:12;;;;12649;;;12670:61;;12724:4;12716:6;12712:17;12702:27;;12670:61;12777:2;12769:6;12766:14;12746:18;12743:38;12740:161;;;12823:10;12818:3;12814:20;12811:1;12804:31;12858:4;12855:1;12848:15;12886:4;12883:1;12876:15;12740:161;;12527:380;;;:::o;12912:350::-;13114:2;13096:21;;;13153:2;13133:18;;;13126:30;13192:28;13187:2;13172:18;;13165:56;13253:2;13238:18;;12912:350::o;13267:340::-;13469:2;13451:21;;;13508:2;13488:18;;;13481:30;-1:-1:-1;;;13542:2:1;13527:18;;13520:46;13598:2;13583:18;;13267:340::o;13612:127::-;13673:10;13668:3;13664:20;13661:1;13654:31;13704:4;13701:1;13694:15;13728:4;13725:1;13718:15;14094:127;14155:10;14150:3;14146:20;14143:1;14136:31;14186:4;14183:1;14176:15;14210:4;14207:1;14200:15;14226:128;14266:3;14297:1;14293:6;14290:1;14287:13;14284:39;;;14303:18;;:::i;:::-;-1:-1:-1;14339:9:1;;14226:128::o;15042:375::-;-1:-1:-1;;;;;15300:15:1;;;15282:34;;15352:15;;;;15347:2;15332:18;;15325:43;15399:2;15384:18;;15377:34;;;;15232:2;15217:18;;15042:375::o;15422:135::-;15461:3;-1:-1:-1;;15482:17:1;;15479:43;;;15502:18;;:::i;:::-;-1:-1:-1;15549:1:1;15538:13;;15422:135::o;15562:436::-;15661:6;15656:3;15649:19;15631:3;15687:4;15716:2;15711:3;15707:12;15700:19;;15742:5;15765:1;15775:198;15789:6;15786:1;15783:13;15775:198;;;15881:10;15854:25;15872:6;15854:25;:::i;:::-;15850:42;15838:55;;15913:12;;;;15948:15;;;;15811:1;15804:9;15775:198;;;-1:-1:-1;15989:3:1;;15562:436;-1:-1:-1;;;;;15562:436:1:o;16003:382::-;-1:-1:-1;;;;;16218:32:1;;16200:51;;16287:2;16282;16267:18;;16260:30;;;-1:-1:-1;;16307:72:1;;16360:18;;16352:6;16344;16307:72;:::i;:::-;16299:80;16003:382;-1:-1:-1;;;;;16003:382:1:o;17076:168::-;17116:7;17182:1;17178;17174:6;17170:14;17167:1;17164:21;17159:1;17152:9;17145:17;17141:45;17138:71;;;17189:18;;:::i;:::-;-1:-1:-1;17229:9:1;;17076:168::o;19689:184::-;19759:6;19812:2;19800:9;19791:7;19787:23;19783:32;19780:52;;;19828:1;19825;19818:12;19780:52;-1:-1:-1;19851:16:1;;19689:184;-1:-1:-1;19689:184:1:o;20166:755::-;20552:1;20548;20543:3;20539:11;20535:19;20527:6;20523:32;20512:9;20505:51;20592:6;20587:2;20576:9;20572:18;20565:34;20635:6;20630:2;20619:9;20615:18;20608:34;20678:3;20673:2;20662:9;20658:18;20651:31;20486:4;20705:73;20773:3;20762:9;20758:19;20750:6;20742;20705:73;:::i;:::-;20827:9;20819:6;20815:22;20809:3;20798:9;20794:19;20787:51;20855:60;20908:6;20900;20892;20855:60;:::i;:::-;20847:68;20166:755;-1:-1:-1;;;;;;;;;;20166:755:1:o;20926:356::-;21128:2;21110:21;;;21147:18;;;21140:30;21206:34;21201:2;21186:18;;21179:62;21273:2;21258:18;;20926:356::o;22271:204::-;22309:3;22345:4;22342:1;22338:12;22377:4;22374:1;22370:12;22412:3;22406:4;22402:14;22397:3;22394:23;22391:49;;;22420:18;;:::i;:::-;22456:13;;22271:204;-1:-1:-1;;;22271:204:1:o;23667:470::-;23846:3;23884:6;23878:13;23900:53;23946:6;23941:3;23934:4;23926:6;23922:17;23900:53;:::i;:::-;24016:13;;23975:16;;;;24038:57;24016:13;23975:16;24072:4;24060:17;;24038:57;:::i;:::-;24111:20;;23667:470;-1:-1:-1;;;;23667:470:1:o;25223:489::-;-1:-1:-1;;;;;25492:15:1;;;25474:34;;25544:15;;25539:2;25524:18;;25517:43;25591:2;25576:18;;25569:34;;;25639:3;25634:2;25619:18;;25612:31;;;25417:4;;25660:46;;25686:19;;25678:6;25660:46;:::i;:::-;25652:54;25223:489;-1:-1:-1;;;;;;25223:489:1:o;25717:249::-;25786:6;25839:2;25827:9;25818:7;25814:23;25810:32;25807:52;;;25855:1;25852;25845:12;25807:52;25887:9;25881:16;25906:30;25930:5;25906:30;:::i;25971:127::-;26032:10;26027:3;26023:20;26020:1;26013:31;26063:4;26060:1;26053:15;26087:4;26084:1;26077:15;26103:120;26143:1;26169;26159:35;;26174:18;;:::i;:::-;-1:-1:-1;26208:9:1;;26103:120::o;26228:125::-;26268:4;26296:1;26293;26290:8;26287:34;;;26301:18;;:::i;:::-;-1:-1:-1;26338:9:1;;26228:125::o;26358:112::-;26390:1;26416;26406:35;;26421:18;;:::i;:::-;-1:-1:-1;26455:9:1;;26358:112::o;26475:127::-;26536:10;26531:3;26527:20;26524:1;26517:31;26567:4;26564:1;26557:15;26591:4;26588:1;26581:15;27010:245;27077:6;27130:2;27118:9;27109:7;27105:23;27101:32;27098:52;;;27146:1;27143;27136:12;27098:52;27178:9;27172:16;27197:28;27219:5;27197:28;:::i;28436:274::-;28565:3;28603:6;28597:13;28619:53;28665:6;28660:3;28653:4;28645:6;28641:17;28619:53;:::i;:::-;28688:16;;;;;28436:274;-1:-1:-1;;28436:274:1:o
Swarm Source
ipfs://8e9621b6fd020abbffe85197a2905757657c41629ce843be4bd71ee736a03f7b
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.