Token Sewer Rat Crew
Overview ERC-721
Total Supply:
1,377 SRC
Holders:
247 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SewerRatCrew
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-04 */ // File: ClampedRandomizer.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract ClampedRandomizer { uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo uint256 private immutable _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed) mapping(uint256 => uint256) _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo constructor(uint256 scopeCap) { _scopeCap = scopeCap; } function _genClampedNonce() internal virtual returns (uint256) { uint256 scope = _scopeCap - _scopeIndex; uint256 swap; uint256 result; uint256 i = randomNumber() % scope; //Setup the value to swap in for the selected number if (_swappedIDs[scope - 1] == 0) { swap = scope - 1; } else { swap = _swappedIDs[scope - 1]; } //Select a random number, swap it out with an unselected one then shorten the selection range by 1 if (_swappedIDs[i] == 0) { result = i; _swappedIDs[i] = swap; } else { result = _swappedIDs[i]; _swappedIDs[i] = swap; } _scopeIndex++; return result; } function randomNumber() internal view returns (uint256) { return uint256( keccak256(abi.encodePacked(block.difficulty, block.timestamp)) ); } } // File: ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint256 _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint256 nativeFee, uint256 zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint256 _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: NonblockingReceiver.sol pragma solidity ^0.8.6; abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint256 payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed( uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload ); function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security require( _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract" ); // try-catch all errors/exceptions // having failed messages does not block messages passing try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages( _payload.length, keccak256(_payload) ); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function onLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public { // only internal transaction require( msg.sender == address(this), "NonblockingReceiver: caller must be Bridge." ); // handle incoming message _LzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam ) internal { endpoint.send{value: msg.value}( _dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam ); } function retryMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload ) external payable { // assert there is message to retry FailedMessages storage failedMsg = failedMessages[_srcChainId][ _srcAddress ][_nonce]; require( failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message" ); require( _payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload" ); // clear the stored message failedMsg.payloadLength = 0; failedMsg.payloadHash = bytes32(0); // execute the message. revert if it fails again this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } // File: NFT.sol // __ __ __ __ __ ___ __ __ __ // (_ |_ | |_ |__) |__) /\ | / |__|_ | | // __)|__|/\|__| \ | \ /--\| \__| \|__|/\| // - - - KOOLKIDSELLEK - - presents - - - - - pragma solidity ^0.8.10; contract SewerRatCrew is ERC721Enumerable, ERC721URIStorage, IERC2981, Pausable, Ownable, ERC721Burnable, NonblockingReceiver, ClampedRandomizer { modifier onlyDevs() { require( devFees[msg.sender].percent > 0, "Dev Only: caller is not the developer" ); _; } event WithdrawFees(address indexed devAddress, uint256 amount); event WithdrawWrongTokens( address indexed devAddress, address tokenAddress, uint256 amount ); event WithdrawWrongNfts( address indexed devAddress, address tokenAddress, uint256 tokenId ); event Migration(address indexed _to, uint256 indexed _tokenId); using SafeMath for uint256; using Address for address; address public royaltyAddress = 0xF47155770fCf8e426CD992Ae0F6c1dc23cB521D9; string public baseURI; string public baseExtension = ".json"; uint256 public mintedSupply; // VARIABLES uint256 public startFrom = 1; uint256 public maxSupply = 1322; uint256 public maxPerTx = 1; uint256 public maxPerPerson = 5; uint256 public price = 0 ether; uint256 private gasForDestinationLzReceive = 350000; uint256 public royalty = 750; // COLLECTED FESS struct DevFee { uint256 percent; uint256 amount; } mapping(address => DevFee) public devFees; address[] private devList; bool public whitelistedOnly = true; mapping(address => uint256) public whiteListed; constructor( address[] memory _devList, uint256[] memory _fees, address _lzEndpoint ) ERC721("Sewer Rat Crew", "SRC") ClampedRandomizer(maxSupply) { require(_devList.length == _fees.length, "Error: invalid data"); uint256 totalFee = 0; for (uint8 i = 0; i < _devList.length; i++) { devList.push(_devList[i]); devFees[_devList[i]] = DevFee(_fees[i], 0); totalFee += _fees[i]; } require(totalFee == 10000, "Error: invalid total fee"); endpoint = ILayerZeroEndpoint(_lzEndpoint); _pause(); } // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint256 tokenId) public payable { require( msg.sender == ownerOf(tokenId), "You must own the token to traverse" ); require( trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel" ); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked( version, gasForDestinationLzReceive ); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint256 messageFee, ) = endpoint.estimateFees( _chainId, address(this), payload, false, adapterParams ); require( msg.value >= messageFee, "Error: msg.value not enough to cover messageFee. Send gas for message fees" ); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal override { // decode (address toAddr, uint256 tokenId) = abi.decode( _payload, (address, uint256) ); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } function _baseURI() internal view override returns (string memory) { return baseURI; } function splitFees(uint256 sentAmount) internal { for (uint8 i = 0; i < devList.length; i++) { address devAddress = devList[i]; uint256 devFee = devFees[devAddress].percent; uint256 devFeeAmount = sentAmount.mul(devFee).div(10000); devFees[devAddress].amount += devFeeAmount; } } function mint(uint256 amount) public payable whenNotPaused { require(amount > 0 && amount <= maxPerTx, "Error: max par tx limit"); require( balanceOf(msg.sender) + 1 <= maxPerPerson, "Error: max per address limit" ); require(msg.value == price * amount, "Error: invalid price"); require( mintedSupply + amount - 1 < maxSupply, "Error: cannot mint more than total supply" ); if (whitelistedOnly) { require( whiteListed[msg.sender] >= amount, "Error: you are not whitelisted or amount is higher than limit" ); } for (uint256 i = 0; i < amount; i++) { internalMint(msg.sender); if (whitelistedOnly) { whiteListed[msg.sender] -= 1; } } splitFees(msg.value); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function Owned(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function tokenExists(uint256 _id) external view returns (bool) { return (_exists(_id)); } function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { return (royaltyAddress, (_salePrice * royalty) / 10000); } //dev function whiteList(address[] memory _addressList, uint256 count) external onlyOwner { require(_addressList.length > 0, "Error: list is empty"); for (uint256 i = 0; i < _addressList.length; i++) { require(_addressList[i] != address(0), "Address cannot be 0."); whiteListed[_addressList[i]] = count; } } function removeWhiteList(address[] memory addressList) external onlyOwner { require(addressList.length > 0, "Error: list is empty"); for (uint256 i = 0; i < addressList.length; i++) whiteListed[addressList[i]] = 0; } function updateWhitelistStatus() external onlyOwner { whitelistedOnly = !whitelistedOnly; } function updatePausedStatus() external onlyOwner { paused() ? _unpause() : _pause(); } function setMaxPerPerson(uint256 newMaxBuy) external onlyOwner { maxPerPerson = newMaxBuy; } function setMaxPerTx(uint256 newMaxBuy) external onlyOwner { maxPerTx = newMaxBuy; } function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } function setPrice(uint256 newPrice) external onlyOwner { price = newPrice; } function setURI(uint256 tokenId, string memory uri) external onlyOwner { _setTokenURI(tokenId, uri); } function setRoyalty(uint16 _royalty) external onlyOwner { require(_royalty >= 0, "Royalty must be greater than or equal to 0%"); require( _royalty <= 750, "Royalty must be greater than or equal to 7,5%" ); royalty = _royalty; } function setRoyaltyAddress(address _royaltyAddress) external onlyOwner { royaltyAddress = _royaltyAddress; } //Overrides function internalMint(address to) internal { uint256 tokenId = _genClampedNonce() + startFrom; mintedSupply += 1; _safeMint(to, tokenId); } function safeMint(address to) public onlyOwner { internalMint(to); } function safeMintMany(address to, uint256 quantity) public onlyOwner { for (uint256 i = 0; i < quantity; i++) { safeMint(to); } } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } /// @dev withdraw fees function withdraw() external onlyDevs { uint256 amount = devFees[msg.sender].amount; require(amount > 0, "Error: no fees :("); devFees[msg.sender].amount = 0; payable(msg.sender).transfer(amount); emit WithdrawFees(msg.sender, amount); } /// @dev emergency withdraw contract balance to the contract owner function emergencyWithdraw() external onlyOwner { uint256 amount = address(this).balance; require(amount > 0, "Error: no fees :("); for (uint8 i = 0; i < devList.length; i++) { address devAddress = devList[i]; devFees[devAddress].amount = 0; } payable(msg.sender).transfer(amount); emit WithdrawFees(msg.sender, amount); } /// @dev withdraw ERC20 tokens function withdrawTokens(address _tokenContract) external onlyOwner { IERC20 tokenContract = IERC20(_tokenContract); uint256 _amount = tokenContract.balanceOf(address(this)); tokenContract.transfer(owner(), _amount); emit WithdrawWrongTokens(msg.sender, _tokenContract, _amount); } /// @dev withdraw ERC721 tokens to the contract owner function withdrawNFT(address _tokenContract, uint256[] memory _id) external onlyOwner { IERC721 tokenContract = IERC721(_tokenContract); for (uint256 i = 0; i < _id.length; i++) { tokenContract.safeTransferFrom(address(this), owner(), _id[i]); emit WithdrawWrongNfts(msg.sender, _tokenContract, _id[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_devList","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"},{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Migration","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":"account","type":"address"}],"name":"Paused","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawWrongNfts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawWrongTokens","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"Owned","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devFees","outputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerPerson","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"safeMintMany","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatePausedStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"whiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600f55601180546001600160a01b03191673f47155770fcf8e426cd992ae0f6c1dc23cb521d917905560e0604052600560a081905264173539b7b760d91b60c090815262000053916013919062000457565b506001601581905561052a60165560178190556005601855600060195562055730601a556102ee601b55601e805460ff191690911790553480156200009757600080fd5b5060405162004c7738038062004c77833981016040819052620000ba91620005fc565b601654604080518082018252600e81526d536577657220526174204372657760901b60208083019182528351808501909452600384526253524360e81b9084015281519192916200010e9160009162000457565b5080516200012490600190602084019062000457565b5050600b805460ff19169055506200013c3362000356565b6080528151835114620001965760405162461bcd60e51b815260206004820152601360248201527f4572726f723a20696e76616c696420646174610000000000000000000000000060448201526064015b60405180910390fd5b6000805b84518160ff161015620002d357601d858260ff1681518110620001c157620001c1620006de565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790556040805180820190915284518190869060ff8516908110620002225762000222620006de565b602002602001015181526020016000815250601c6000878460ff1681518110620002505762000250620006de565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010155905050838160ff1681518110620002a757620002a7620006de565b602002602001015182620002bc91906200070a565b915080620002ca8162000725565b9150506200019a565b508061271014620003275760405162461bcd60e51b815260206004820152601860248201527f4572726f723a20696e76616c696420746f74616c20666565000000000000000060448201526064016200018d565b600c80546001600160a01b0319166001600160a01b0384161790556200034c620003b0565b5050505062000785565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620003ba6200040d565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003f03390565b6040516001600160a01b03909116815260200160405180910390a1565b600b5460ff1615620004555760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016200018d565b565b828054620004659062000748565b90600052602060002090601f016020900481019282620004895760008555620004d4565b82601f10620004a457805160ff1916838001178555620004d4565b82800160010185558215620004d4579182015b82811115620004d4578251825591602001919060010190620004b7565b50620004e2929150620004e6565b5090565b5b80821115620004e25760008155600101620004e7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200053e576200053e620004fd565b604052919050565b60006001600160401b03821115620005625762000562620004fd565b5060051b60200190565b80516001600160a01b03811681146200058457600080fd5b919050565b600082601f8301126200059b57600080fd5b81516020620005b4620005ae8362000546565b62000513565b82815260059290921b84018101918181019086841115620005d457600080fd5b8286015b84811015620005f15780518352918301918301620005d8565b509695505050505050565b6000806000606084860312156200061257600080fd5b83516001600160401b03808211156200062a57600080fd5b818601915086601f8301126200063f57600080fd5b8151602062000652620005ae8362000546565b82815260059290921b8401810191818101908a8411156200067257600080fd5b948201945b838610156200069b576200068b866200056c565b8252948201949082019062000677565b91890151919750909350505080821115620006b557600080fd5b50620006c48682870162000589565b925050620006d5604085016200056c565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620007205762000720620006f4565b500190565b600060ff821660ff8114156200073f576200073f620006f4565b60010192915050565b600181811c908216806200075d57607f821691505b602082108114156200077f57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516144d6620007a16000396000612d5f01526144d66000f3fe6080604052600436106103b65760003560e01c8063768d7138116101f2578063b9bfa0bc1161010d578063d5abeb01116100a0578063f147efeb1161006f578063f147efeb14610b25578063f2fde38b14610b59578063f968adbe14610b79578063fa0fca8414610b8f57600080fd5b8063d5abeb0114610a91578063db2e21bc14610aa7578063e985e9c514610abc578063eb8d72b714610b0557600080fd5b8063c87b56dd116100dc578063c87b56dd14610a1e578063cf89fa0314610a3e578063d1deba1f14610a51578063d2f8dd4514610a6457600080fd5b8063b9bfa0bc146109be578063c1bd8cf9146109d3578063c6682862146109e9578063c6f6f216146109fe57600080fd5b8063943fb87211610185578063a0712d6811610154578063a0712d681461094b578063a22cb4651461095e578063ad2f852a1461097e578063b88d4fde1461099e57600080fd5b8063943fb872146108e057806395d89b41146109005780639bdedea514610915578063a035b1fe1461093557600080fd5b80638ee74912116101c15780638ee749121461081b5780638fe4a245146108865780639186b425146108a657806391b7f5ed146108c057600080fd5b8063768d7138146107a25780637e0586f1146107b8578063862440e2146107d85780638da5cb5b146107f857600080fd5b806339745791116102e257806355f804b3116102755780636c0360eb116102445780636c0360eb1461073857806370a082311461074d578063715018a61461076d5780637533d7881461078257600080fd5b806355f804b3146106cb5780635c975abb146106eb5780636352211e1461070357806367dded4d1461072357600080fd5b806342966c68116102b157806342966c681461064b578063483efda21461066b57806349df728c1461068b5780634f6ccce7146106ab57600080fd5b806339745791146105d65780633ccfd60b146105f657806340d097c31461060b57806342842e0e1461062b57600080fd5b806318160ddd1161035a57806329ee566c1161032957806329ee566c146105415780632a55205a146105575780632f745c591461059657806336e79a5a146105b657600080fd5b806318160ddd146104cc5780631c37a822146104eb578063208904c71461050b57806323b872dd1461052157600080fd5b806306d254da1161039657806306d254da1461043257806306fdde0314610452578063081812fc14610474578063095ea7b3146104ac57600080fd5b80621d3567146103bb578062923f9e146103dd57806301ffc9a714610412575b600080fd5b3480156103c757600080fd5b506103db6103d6366004613848565b610bbc565b005b3480156103e957600080fd5b506103fd6103f83660046138cc565b610db6565b60405190151581526020015b60405180910390f35b34801561041e57600080fd5b506103fd61042d3660046138fb565b610dd7565b34801561043e57600080fd5b506103db61044d36600461392d565b610dfc565b34801561045e57600080fd5b50610467610e26565b60405161040991906139a2565b34801561048057600080fd5b5061049461048f3660046138cc565b610eb8565b6040516001600160a01b039091168152602001610409565b3480156104b857600080fd5b506103db6104c73660046139b5565b610edf565b3480156104d857600080fd5b506008545b604051908152602001610409565b3480156104f757600080fd5b506103db610506366004613848565b610ff5565b34801561051757600080fd5b506104dd60155481565b34801561052d57600080fd5b506103db61053c3660046139e1565b611064565b34801561054d57600080fd5b506104dd601b5481565b34801561056357600080fd5b50610577610572366004613a22565b611096565b604080516001600160a01b039093168352602083019190915201610409565b3480156105a257600080fd5b506104dd6105b13660046139b5565b6110d1565b3480156105c257600080fd5b506103db6105d1366004613a44565b611167565b3480156105e257600080fd5b506103db6105f1366004613af6565b6111e4565b34801561060257600080fd5b506103db61129b565b34801561061757600080fd5b506103db61062636600461392d565b6113d0565b34801561063757600080fd5b506103db6106463660046139e1565b6113e4565b34801561065757600080fd5b506103db6106663660046138cc565b6113ff565b34801561067757600080fd5b506103db6106863660046138cc565b61142d565b34801561069757600080fd5b506103db6106a636600461392d565b61143a565b3480156106b757600080fd5b506104dd6106c63660046138cc565b611593565b3480156106d757600080fd5b506103db6106e6366004613b2a565b611626565b3480156106f757600080fd5b50600b5460ff166103fd565b34801561070f57600080fd5b5061049461071e3660046138cc565b611641565b34801561072f57600080fd5b506103db6116a1565b34801561074457600080fd5b506104676116c5565b34801561075957600080fd5b506104dd61076836600461392d565b611753565b34801561077957600080fd5b506103db6117d9565b34801561078e57600080fd5b5061046761079d366004613a44565b6117eb565b3480156107ae57600080fd5b506104dd60185481565b3480156107c457600080fd5b506103db6107d3366004613b5e565b611804565b3480156107e457600080fd5b506103db6107f3366004613ba2565b611929565b34801561080457600080fd5b50600b5461010090046001600160a01b0316610494565b34801561082757600080fd5b50610871610836366004613be8565b600d60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b60408051928352602083019190915201610409565b34801561089257600080fd5b506103db6108a13660046139b5565b61193b565b3480156108b257600080fd5b50601e546103fd9060ff1681565b3480156108cc57600080fd5b506103db6108db3660046138cc565b611969565b3480156108ec57600080fd5b506103db6108fb3660046138cc565b611976565b34801561090c57600080fd5b50610467611983565b34801561092157600080fd5b506103db610930366004613c3e565b611992565b34801561094157600080fd5b506104dd60195481565b6103db6109593660046138cc565b611ad5565b34801561096a57600080fd5b506103db610979366004613cf1565b611d60565b34801561098a57600080fd5b50601154610494906001600160a01b031681565b3480156109aa57600080fd5b506103db6109b9366004613d2a565b611d6b565b3480156109ca57600080fd5b506103db611d9d565b3480156109df57600080fd5b506104dd60145481565b3480156109f557600080fd5b50610467611db9565b348015610a0a57600080fd5b506103db610a193660046138cc565b611dc6565b348015610a2a57600080fd5b50610467610a393660046138cc565b611dd3565b6103db610a4c366004613d89565b611dde565b6103db610a5f366004613de6565b6120b3565b348015610a7057600080fd5b50610a84610a7f36600461392d565b612240565b6040516104099190613e71565b348015610a9d57600080fd5b506104dd60165481565b348015610ab357600080fd5b506103db6122fe565b348015610ac857600080fd5b506103fd610ad7366004613eb5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b1157600080fd5b506103db610b20366004613ee3565b6123d6565b348015610b3157600080fd5b50610871610b4036600461392d565b601c602052600090815260409020805460019091015482565b348015610b6557600080fd5b506103db610b7436600461392d565b6123fc565b348015610b8557600080fd5b506104dd60175481565b348015610b9b57600080fd5b506104dd610baa36600461392d565b601f6020526000908152604090205481565b600c546001600160a01b03163314610bd357600080fd5b61ffff84166000908152600e602052604090208054610bf190613f35565b90508351148015610c30575061ffff84166000908152600e6020526040908190209051610c1e9190613f6a565b60405180910390208380519060200120145b610c9e5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610cc7908790879087908790600401613fdc565b600060405180830381600087803b158015610ce157600080fd5b505af1925050508015610cf2575060015b610db0576040518060400160405280825181526020018280519060200120815250600d60008661ffff1661ffff16815260200190815260200160002084604051610d3c9190614025565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610da7908690869086908690613fdc565b60405180910390a15b50505050565b6000818152600260205260408120546001600160a01b031615155b92915050565b60006001600160e01b0319821663152a902d60e11b1480610dd15750610dd182612472565b610e04612497565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054610e3590613f35565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6190613f35565b8015610eae5780601f10610e8357610100808354040283529160200191610eae565b820191906000526020600020905b815481529060010190602001808311610e9157829003601f168201915b5050505050905090565b6000610ec3826124f7565b506000908152600460205260409020546001600160a01b031690565b6000610eea82611641565b9050806001600160a01b0316836001600160a01b03161415610f585760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c95565b336001600160a01b0382161480610f745750610f748133610ad7565b610fe65760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610c95565b610ff08383612556565b505050565b3330146110585760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610c95565b610db0848484846125c4565b61106f335b826125f1565b61108b5760405162461bcd60e51b8152600401610c9590614041565b610ff0838383612670565b601154601b5460009182916001600160a01b0390911690612710906110bb90866140a5565b6110c591906140da565b915091505b9250929050565b60006110dc83611753565b821061113e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c95565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61116f612497565b6102ee8161ffff1611156111db5760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201526c657175616c20746f20372c352560981b6064820152608401610c95565b61ffff16601b55565b6111ec612497565b60008151116112345760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610c95565b60005b8151811015611297576000601f6000848481518110611258576112586140ee565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061128f90614104565b915050611237565b5050565b336000908152601c60205260409020546113055760405162461bcd60e51b815260206004820152602560248201527f446576204f6e6c793a2063616c6c6572206973206e6f742074686520646576656044820152643637b832b960d91b6064820152608401610c95565b336000908152601c6020526040902060010154806113595760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610c95565b336000818152601c60205260408082206001018290555183156108fc0291849190818181858888f19350505050158015611397573d6000803e3d6000fd5b5060405181815233907f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f9060200160405180910390a250565b6113d8612497565b6113e181612817565b50565b610ff083838360405180602001604052806000815250611d6b565b61140833611069565b6114245760405162461bcd60e51b8152600401610c9590614041565b6113e181612853565b611435612497565b601855565b611442612497565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561148b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114af919061411f565b9050816001600160a01b031663a9059cbb6114d8600b546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611525573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115499190614138565b50604080516001600160a01b03851681526020810183905233917f5aa586896a67fb05c3b86276f66eecee7da00719d0e7299c403596fa2ec58ca4910160405180910390a2505050565b600061159e60085490565b82106116015760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c95565b60088281548110611614576116146140ee565b90600052602060002001549050919050565b61162e612497565b8051611297906012906020840190613622565b6000818152600260205260408120546001600160a01b031680610dd15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c95565b6116a9612497565b600b5460ff166116bd576116bb61285c565b565b6116bb6128b6565b601280546116d290613f35565b80601f01602080910402602001604051908101604052809291908181526020018280546116fe90613f35565b801561174b5780601f106117205761010080835404028352916020019161174b565b820191906000526020600020905b81548152906001019060200180831161172e57829003601f168201915b505050505081565b60006001600160a01b0382166117bd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610c95565b506001600160a01b031660009081526003602052604090205490565b6117e1612497565b6116bb60006128ef565b600e60205260009081526040902080546116d290613f35565b61180c612497565b60008251116118545760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610c95565b60005b8251811015610ff05760006001600160a01b031683828151811061187d5761187d6140ee565b60200260200101516001600160a01b031614156118d35760405162461bcd60e51b815260206004820152601460248201527320b2323932b9b99031b0b73737ba10313290181760611b6044820152606401610c95565b81601f60008584815181106118ea576118ea6140ee565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061192190614104565b915050611857565b611931612497565b6112978282612949565b611943612497565b60005b81811015610ff057611957836113d0565b8061196181614104565b915050611946565b611971612497565b601955565b61197e612497565b601a55565b606060018054610e3590613f35565b61199a612497565b8160005b8251811015610db057816001600160a01b03166342842e0e306119cf600b546001600160a01b036101009091041690565b8685815181106119e1576119e16140ee565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611a3b57600080fd5b505af1158015611a4f573d6000803e3d6000fd5b50505050336001600160a01b03167fb8dbf4ce06446b88ef02ffd28a948c2637ac80fb0bd4d3a31c70878c1046eb7f85858481518110611a9157611a916140ee565b6020026020010151604051611abb9291906001600160a01b03929092168252602082015260400190565b60405180910390a280611acd81614104565b91505061199e565b611add6129e3565b600081118015611aef57506017548111155b611b3b5760405162461bcd60e51b815260206004820152601760248201527f4572726f723a206d617820706172207478206c696d69740000000000000000006044820152606401610c95565b601854611b4733611753565b611b52906001614155565b1115611ba05760405162461bcd60e51b815260206004820152601c60248201527f4572726f723a206d6178207065722061646472657373206c696d6974000000006044820152606401610c95565b80601954611bae91906140a5565b3414611bf35760405162461bcd60e51b81526020600482015260146024820152734572726f723a20696e76616c696420707269636560601b6044820152606401610c95565b601654600182601454611c069190614155565b611c10919061416d565b10611c6f5760405162461bcd60e51b815260206004820152602960248201527f4572726f723a2063616e6e6f74206d696e74206d6f7265207468616e20746f74604482015268616c20737570706c7960b81b6064820152608401610c95565b601e5460ff1615611cff57336000908152601f6020526040902054811115611cff5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20796f7520617265206e6f742077686974656c6973746564206f60448201527f7220616d6f756e7420697320686967686572207468616e206c696d69740000006064820152608401610c95565b60005b81811015611d5657611d1333612817565b601e5460ff1615611d4457336000908152601f60205260408120805460019290611d3e90849061416d565b90915550505b80611d4e81614104565b915050611d02565b506113e134612a29565b611297338383612adc565b611d7533836125f1565b611d915760405162461bcd60e51b8152600401610c9590614041565b610db084848484612bab565b611da5612497565b601e805460ff19811660ff90911615179055565b601380546116d290613f35565b611dce612497565b601755565b6060610dd182612bde565b611de781611641565b6001600160a01b0316336001600160a01b031614611e525760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610c95565b61ffff82166000908152600e602052604081208054611e7090613f35565b905011611ed65760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610c95565b611edf81612853565b60408051336020820152808201839052815180820383018152606082018352601a54600160f01b60808401526082808401919091528351808403909101815260a2830193849052600c5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611f62908990309089908790899060a601614184565b6040805180830381865afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa291906141d8565b5090508034101561202e5760405162461bcd60e51b815260206004820152604a60248201527f4572726f723a206d73672e76616c7565206e6f7420656e6f75676820746f206360448201527f6f766572206d6573736167654665652e2053656e642067617320666f72206d656064820152697373616765206665657360b01b608482015260a401610c95565b600c5461ffff87166000908152600e6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492612079928c928b913391908b906004016141fc565b6000604051808303818588803b15801561209257600080fd5b505af11580156120a6573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600d602052604080822090516120d4908790614025565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061215b5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610c95565b80548214801561218557508060010154838360405161217b9291906142dc565b6040518091039020145b6121d15760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610c95565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061220690899089908990899089906004016142ec565b600060405180830381600087803b15801561222057600080fd5b505af1158015612234573d6000803e3d6000fd5b50505050505050505050565b6060600061224d83611753565b90508061226e5760408051600080825260208201909252905b509392505050565b6000816001600160401b038111156122885761228861377c565b6040519080825280602002602001820160405280156122b1578160200160208202803683370190505b50905060005b82811015612266576122c985826110d1565b8282815181106122db576122db6140ee565b6020908102919091010152806122f081614104565b9150506122b7565b50919050565b612306612497565b47806123485760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610c95565b60005b601d5460ff821610156123a8576000601d8260ff1681548110612370576123706140ee565b60009182526020808320909101546001600160a01b03168252601c9052604081206001015550806123a08161434d565b91505061234b565b50604051339082156108fc029083906000818181858888f19350505050158015611397573d6000803e3d6000fd5b6123de612497565b61ffff83166000908152600e60205260409020610db09083836136a6565b612404612497565b6001600160a01b0381166124695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c95565b6113e1816128ef565b60006001600160e01b0319821663780e9d6360e01b1480610dd15750610dd182612cda565b600b546001600160a01b036101009091041633146116bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c95565b6000818152600260205260409020546001600160a01b03166113e15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c95565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061258b82611641565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906125db919061436d565b915091506125e98282612d2a565b505050505050565b6000806125fd83611641565b9050806001600160a01b0316846001600160a01b0316148061264457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806126685750836001600160a01b031661265d84610eb8565b6001600160a01b0316145b949350505050565b826001600160a01b031661268382611641565b6001600160a01b0316146126e75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c95565b6001600160a01b0382166127495760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c95565b612754838383612d44565b61275f600082612556565b6001600160a01b038316600090815260036020526040812080546001929061278890849061416d565b90915550506001600160a01b03821660009081526003602052604081208054600192906127b6908490614155565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000601554612824612d57565b61282e9190614155565b90506001601460008282546128439190614155565b9091555061129790508282612d2a565b6113e181612e5e565b6128646129e3565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128993390565b6040516001600160a01b03909116815260200160405180910390a1565b6128be612e9e565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612899565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000828152600260205260409020546001600160a01b03166129c45760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610c95565b6000828152600a602090815260409091208251610ff092840190613622565b600b5460ff16156116bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c95565b60005b601d5460ff82161015611297576000601d8260ff1681548110612a5157612a516140ee565b60009182526020808320909101546001600160a01b0316808352601c909152604082205490925090612a8f612710612a898785612ee7565b90612efa565b6001600160a01b0384166000908152601c6020526040812060010180549293508392909190612abf908490614155565b925050819055505050508080612ad49061434d565b915050612a2c565b816001600160a01b0316836001600160a01b03161415612b3e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c95565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bb6848484612670565b612bc284848484612f06565b610db05760405162461bcd60e51b8152600401610c959061439b565b6060612be9826124f7565b6000828152600a602052604081208054612c0290613f35565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2e90613f35565b8015612c7b5780601f10612c5057610100808354040283529160200191612c7b565b820191906000526020600020905b815481529060010190602001808311612c5e57829003601f168201915b505050505090506000612c8c613004565b9050805160001415612c9f575092915050565b815115612cd1578082604051602001612cb99291906143ed565b60405160208183030381529060405292505050919050565b61266884613013565b60006001600160e01b031982166380ac58cd60e01b1480612d0b57506001600160e01b03198216635b5e139f60e01b145b80610dd157506301ffc9a760e01b6001600160e01b0319831614610dd1565b611297828260405180602001604052806000815250613079565b612d4c6129e3565b610ff08383836130ac565b600080600f547f0000000000000000000000000000000000000000000000000000000000000000612d88919061416d565b9050600080600083612d98613164565b612da2919061441c565b905060106000612db360018761416d565b81526020019081526020016000205460001415612ddc57612dd560018561416d565b9250612dfd565b60106000612deb60018761416d565b81526020019081526020016000205492505b600081815260106020526040902054612e29576000818152601060205260409020839055905080612e40565b600081815260106020526040902080549084905591505b600f8054906000612e5083614104565b909155509195945050505050565b612e67816131a0565b6000818152600a602052604090208054612e8090613f35565b1590506113e1576000818152600a602052604081206113e19161371a565b600b5460ff166116bb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c95565b6000612ef382846140a5565b9392505050565b6000612ef382846140da565b60006001600160a01b0384163b15612ff957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612f4a903390899088908890600401614430565b6020604051808303816000875af1925050508015612f85575060408051601f3d908101601f19168201909252612f829181019061446d565b60015b612fdf573d808015612fb3576040519150601f19603f3d011682016040523d82523d6000602084013e612fb8565b606091505b508051612fd75760405162461bcd60e51b8152600401610c959061439b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612668565b506001949350505050565b606060128054610e3590613f35565b606061301e826124f7565b6000613028613004565b905060008151116130485760405180602001604052806000815250612ef3565b8061305284613247565b6040516020016130639291906143ed565b6040516020818303038152906040529392505050565b6130838383613344565b6130906000848484612f06565b610ff05760405162461bcd60e51b8152600401610c959061439b565b6001600160a01b0383166131075761310281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61312a565b816001600160a01b0316836001600160a01b03161461312a5761312a8382613492565b6001600160a01b03821661314157610ff08161352f565b826001600160a01b0316826001600160a01b031614610ff057610ff082826135de565b60004442604051602001613182929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b60006131ab82611641565b90506131b981600084612d44565b6131c4600083612556565b6001600160a01b03811660009081526003602052604081208054600192906131ed90849061416d565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60608161326b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613295578061327f81614104565b915061328e9050600a836140da565b915061326f565b6000816001600160401b038111156132af576132af61377c565b6040519080825280601f01601f1916602001820160405280156132d9576020820181803683370190505b5090505b8415612668576132ee60018361416d565b91506132fb600a8661441c565b613306906030614155565b60f81b81838151811061331b5761331b6140ee565b60200101906001600160f81b031916908160001a90535061333d600a866140da565b94506132dd565b6001600160a01b03821661339a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c95565b6000818152600260205260409020546001600160a01b0316156133ff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c95565b61340b60008383612d44565b6001600160a01b0382166000908152600360205260408120805460019290613434908490614155565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161349f84611753565b6134a9919061416d565b6000838152600760205260409020549091508082146134fc576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906135419060019061416d565b60008381526009602052604081205460088054939450909284908110613569576135696140ee565b90600052602060002001549050806008838154811061358a5761358a6140ee565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806135c2576135c261448a565b6001900381819060005260206000200160009055905550505050565b60006135e983611753565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461362e90613f35565b90600052602060002090601f0160209004810192826136505760008555613696565b82601f1061366957805160ff1916838001178555613696565b82800160010185558215613696579182015b8281111561369657825182559160200191906001019061367b565b506136a2929150613750565b5090565b8280546136b290613f35565b90600052602060002090601f0160209004810192826136d45760008555613696565b82601f106136ed5782800160ff19823516178555613696565b82800160010185558215613696579182015b828111156136965782358255916020019190600101906136ff565b50805461372690613f35565b6000825580601f10613736575050565b601f0160209004906000526020600020908101906113e191905b5b808211156136a25760008155600101613751565b803561ffff8116811461377757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156137ba576137ba61377c565b604052919050565b600082601f8301126137d357600080fd5b81356001600160401b038111156137ec576137ec61377c565b6137ff601f8201601f1916602001613792565b81815284602083860101111561381457600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b038116811461377757600080fd5b6000806000806080858703121561385e57600080fd5b61386785613765565b935060208501356001600160401b038082111561388357600080fd5b61388f888389016137c2565b945061389d60408801613831565b935060608701359150808211156138b357600080fd5b506138c0878288016137c2565b91505092959194509250565b6000602082840312156138de57600080fd5b5035919050565b6001600160e01b0319811681146113e157600080fd5b60006020828403121561390d57600080fd5b8135612ef3816138e5565b6001600160a01b03811681146113e157600080fd5b60006020828403121561393f57600080fd5b8135612ef381613918565b60005b8381101561396557818101518382015260200161394d565b83811115610db05750506000910152565b6000815180845261398e81602086016020860161394a565b601f01601f19169290920160200192915050565b602081526000612ef36020830184613976565b600080604083850312156139c857600080fd5b82356139d381613918565b946020939093013593505050565b6000806000606084860312156139f657600080fd5b8335613a0181613918565b92506020840135613a1181613918565b929592945050506040919091013590565b60008060408385031215613a3557600080fd5b50508035926020909101359150565b600060208284031215613a5657600080fd5b612ef382613765565b60006001600160401b03821115613a7857613a7861377c565b5060051b60200190565b600082601f830112613a9357600080fd5b81356020613aa8613aa383613a5f565b613792565b82815260059290921b84018101918181019086841115613ac757600080fd5b8286015b84811015613aeb578035613ade81613918565b8352918301918301613acb565b509695505050505050565b600060208284031215613b0857600080fd5b81356001600160401b03811115613b1e57600080fd5b61266884828501613a82565b600060208284031215613b3c57600080fd5b81356001600160401b03811115613b5257600080fd5b612668848285016137c2565b60008060408385031215613b7157600080fd5b82356001600160401b03811115613b8757600080fd5b613b9385828601613a82565b95602094909401359450505050565b60008060408385031215613bb557600080fd5b8235915060208301356001600160401b03811115613bd257600080fd5b613bde858286016137c2565b9150509250929050565b600080600060608486031215613bfd57600080fd5b613c0684613765565b925060208401356001600160401b03811115613c2157600080fd5b613c2d868287016137c2565b925050604084013590509250925092565b60008060408385031215613c5157600080fd5b8235613c5c81613918565b91506020838101356001600160401b03811115613c7857600080fd5b8401601f81018613613c8957600080fd5b8035613c97613aa382613a5f565b81815260059190911b82018301908381019088831115613cb657600080fd5b928401925b82841015613cd457833582529284019290840190613cbb565b80955050505050509250929050565b80151581146113e157600080fd5b60008060408385031215613d0457600080fd5b8235613d0f81613918565b91506020830135613d1f81613ce3565b809150509250929050565b60008060008060808587031215613d4057600080fd5b8435613d4b81613918565b93506020850135613d5b81613918565b92506040850135915060608501356001600160401b03811115613d7d57600080fd5b6138c0878288016137c2565b60008060408385031215613d9c57600080fd5b6139d383613765565b60008083601f840112613db757600080fd5b5081356001600160401b03811115613dce57600080fd5b6020830191508360208285010111156110ca57600080fd5b600080600080600060808688031215613dfe57600080fd5b613e0786613765565b945060208601356001600160401b0380821115613e2357600080fd5b613e2f89838a016137c2565b9550613e3d60408901613831565b94506060880135915080821115613e5357600080fd5b50613e6088828901613da5565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015613ea957835183529284019291840191600101613e8d565b50909695505050505050565b60008060408385031215613ec857600080fd5b8235613ed381613918565b91506020830135613d1f81613918565b600080600060408486031215613ef857600080fd5b613f0184613765565b925060208401356001600160401b03811115613f1c57600080fd5b613f2886828701613da5565b9497909650939450505050565b600181811c90821680613f4957607f821691505b602082108114156122f857634e487b7160e01b600052602260045260246000fd5b6000808354613f7881613f35565b60018281168015613f905760018114613fa157613fd0565b60ff19841687528287019450613fd0565b8760005260208060002060005b85811015613fc75781548a820152908401908201613fae565b50505082870194505b50929695505050505050565b61ffff85168152608060208201526000613ff96080830186613976565b6001600160401b0385166040840152828103606084015261401a8185613976565b979650505050505050565b6000825161403781846020870161394a565b9190910192915050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156140bf576140bf61408f565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826140e9576140e96140c4565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156141185761411861408f565b5060010190565b60006020828403121561413157600080fd5b5051919050565b60006020828403121561414a57600080fd5b8151612ef381613ce3565b600082198211156141685761416861408f565b500190565b60008282101561417f5761417f61408f565b500390565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906141b290830186613976565b841515606084015282810360808401526141cc8185613976565b98975050505050505050565b600080604083850312156141eb57600080fd5b505080516020909101519092909150565b61ffff871681526000602060c0818401526000885461421a81613f35565b8060c087015260e060018084166000811461423c57600181146142515761427f565b60ff198516898401526101008901955061427f565b8d6000528660002060005b858110156142775781548b820186015290830190880161425c565b8a0184019650505b505050505083810360408501526142968189613976565b9150506142ae60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526142cf8185613976565b9998505050505050505050565b8183823760009101908152919050565b61ffff861681526080602082015260006143096080830187613976565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b600060ff821660ff8114156143645761436461408f565b60010192915050565b6000806040838503121561438057600080fd5b825161438b81613918565b6020939093015192949293505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516143ff81846020880161394a565b83519083019061441381836020880161394a565b01949350505050565b60008261442b5761442b6140c4565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061446390830184613976565b9695505050505050565b60006020828403121561447f57600080fd5b8151612ef3816138e5565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220166ca3973ee7e5739f38ee4d84c19ed9c885d8b7699f691b35ae93af7daf1e3b64736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f47155770fcf8e426cd992ae0f6c1dc23cb521d900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f47155770fcf8e426cd992ae0f6c1dc23cb521d900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _devList (address[]): 0xf47155770fcf8e426cd992ae0f6c1dc23cb521d9
Arg [1] : _fees (uint256[]): 10000
Arg [2] : _lzEndpoint (address): 0xb6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000f47155770fcf8e426cd992ae0f6c1dc23cb521d9
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed ByteCode Sourcemap
76557:11836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72985:1098;;;;;;;;;;-1:-1:-1;72985:1098:0;;;;;:::i;:::-;;:::i;:::-;;83395:103;;;;;;;;;;-1:-1:-1;83395:103:0;;;;;:::i;:::-;;:::i;:::-;;;2340:14:1;;2333:22;2315:41;;2303:2;2288:18;83395:103:0;;;;;;;;86085:292;;;;;;;;;;-1:-1:-1;86085:292:0;;;;;:::i;:::-;;:::i;85494:122::-;;;;;;;;;;-1:-1:-1;85494:122:0;;;;;:::i;:::-;;:::i;47520:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49033:171::-;;;;;;;;;;-1:-1:-1;49033:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4165:32:1;;;4147:51;;4135:2;4120:18;49033:171:0;4001:203:1;48550:417:0;;;;;;;;;;-1:-1:-1;48550:417:0;;;;;:::i;:::-;;:::i;63387:113::-;;;;;;;;;;-1:-1:-1;63475:10:0;:17;63387:113;;;4675:25:1;;;4663:2;4648:18;63387:113:0;4529:177:1;74091:435:0;;;;;;;;;;-1:-1:-1;74091:435:0;;;;;:::i;:::-;;:::i;77608:28::-;;;;;;;;;;;;;;;;49733:336;;;;;;;;;;-1:-1:-1;49733:336:0;;;;;:::i;:::-;;:::i;77850:28::-;;;;;;;;;;;;;;;;83506:238;;;;;;;;;;-1:-1:-1;83506:238:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5617:32:1;;;5599:51;;5681:2;5666:18;;5659:34;;;;5572:18;83506:238:0;5425:274:1;63055:256:0;;;;;;;;;;-1:-1:-1;63055:256:0;;;;;:::i;:::-;;:::i;85192:294::-;;;;;;;;;;-1:-1:-1;85192:294:0;;;;;:::i;:::-;;:::i;84157:252::-;;;;;;;;;;-1:-1:-1;84157:252:0;;;;;:::i;:::-;;:::i;86796:287::-;;;;;;;;;;;;;:::i;85822:82::-;;;;;;;;;;-1:-1:-1;85822:82:0;;;;;:::i;:::-;;:::i;50140:185::-;;;;;;;;;;-1:-1:-1;50140:185:0;;;;;:::i;:::-;;:::i;69433:243::-;;;;;;;;;;-1:-1:-1;69433:243:0;;;;;:::i;:::-;;:::i;84638:106::-;;;;;;;;;;-1:-1:-1;84638:106:0;;;;;:::i;:::-;;:::i;87614:321::-;;;;;;;;;;-1:-1:-1;87614:321:0;;;;;:::i;:::-;;:::i;63577:233::-;;;;;;;;;;-1:-1:-1;63577:233:0;;;;;:::i;:::-;;:::i;84858:104::-;;;;;;;;;;-1:-1:-1;84858:104:0;;;;;:::i;:::-;;:::i;44204:86::-;;;;;;;;;;-1:-1:-1;44275:7:0;;;;44204:86;;47231:222;;;;;;;;;;-1:-1:-1;47231:222:0;;;;;:::i;:::-;;:::i;84530:100::-;;;;;;;;;;;;;:::i;77480:21::-;;;;;;;;;;;;;:::i;46962:207::-;;;;;;;;;;-1:-1:-1;46962:207:0;;;;;:::i;:::-;;:::i;71566:103::-;;;;;;;;;;;;;:::i;72784:51::-;;;;;;;;;;-1:-1:-1;72784:51:0;;;;;:::i;:::-;;:::i;77715:31::-;;;;;;;;;;;;;;;;83765:384;;;;;;;;;;-1:-1:-1;83765:384:0;;;;;:::i;:::-;;:::i;85068:116::-;;;;;;;;;;-1:-1:-1;85068:116:0;;;;;:::i;:::-;;:::i;70918:87::-;;;;;;;;;;-1:-1:-1;70991:6:0;;;;;-1:-1:-1;;;;;70991:6:0;70918:87;;72675:102;;;;;;;;;;-1:-1:-1;72675:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9179:25:1;;;9235:2;9220:18;;9213:34;;;;9152:18;72675:102:0;9005:248:1;85912:165:0;;;;;;;;;;-1:-1:-1;85912:165:0;;;;;:::i;:::-;;:::i;78069:34::-;;;;;;;;;;-1:-1:-1;78069:34:0;;;;;;;;84970:90;;;;;;;;;;-1:-1:-1;84970:90:0;;;;;:::i;:::-;;:::i;80710:128::-;;;;;;;;;;-1:-1:-1;80710:128:0;;;;;:::i;:::-;;:::i;47689:104::-;;;;;;;;;;;;;:::i;88002:388::-;;;;;;;;;;-1:-1:-1;88002:388:0;;;;;:::i;:::-;;:::i;77753:30::-;;;;;;;;;;;;;;;;81748:933;;;;;;:::i;:::-;;:::i;49276:155::-;;;;;;;;;;-1:-1:-1;49276:155:0;;;;;:::i;:::-;;:::i;77397:74::-;;;;;;;;;;-1:-1:-1;77397:74:0;;;;-1:-1:-1;;;;;77397:74:0;;;50396:323;;;;;;;;;;-1:-1:-1;50396:323:0;;;;;:::i;:::-;;:::i;84417:105::-;;;;;;;;;;;;;:::i;77554:27::-;;;;;;;;;;;;;;;;77508:37;;;;;;;;;;;;;:::i;84752:98::-;;;;;;;;;;-1:-1:-1;84752:98:0;;;;;:::i;:::-;;:::i;82689:196::-;;;;;;;;;;-1:-1:-1;82689:196:0;;;;;:::i;:::-;;:::i;78931:1695::-;;;;;;:::i;:::-;;:::i;75186:916::-;;;;;;:::i;:::-;;:::i;82893:494::-;;;;;;;;;;-1:-1:-1;82893:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77643:31::-;;;;;;;;;;;;;;;;87163:407;;;;;;;;;;;;;:::i;49502:164::-;;;;;;;;;;-1:-1:-1;49502:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;49623:25:0;;;49599:4;49623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49502:164;76110:181;;;;;;;;;;-1:-1:-1;76110:181:0;;;;;:::i;:::-;;:::i;77987:41::-;;;;;;;;;;-1:-1:-1;77987:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;71824:201;;;;;;;;;;-1:-1:-1;71824:201:0;;;;;:::i;:::-;;:::i;77681:27::-;;;;;;;;;;;;;;;;78110:46;;;;;;;;;;-1:-1:-1;78110:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;72985:1098;73190:8;;-1:-1:-1;;;;;73190:8:0;73168:10;:31;73160:40;;;;;;73325:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;73303:11;:18;:61;:168;;;;-1:-1:-1;73438:32:0;;;;;;;:19;:32;;;;;;;73428:43;;;;73438:32;73428:43;:::i;:::-;;;;;;;;73395:11;73385:22;;;;;;:86;73303:168;73281:270;;;;-1:-1:-1;;;73281:270:0;;16028:2:1;73281:270:0;;;16010:21:1;16067:2;16047:18;;;16040:30;16106:34;16086:18;;;16079:62;-1:-1:-1;;;16157:18:1;;;16150:50;16217:19;;73281:270:0;;;;;;;;;73679:60;;-1:-1:-1;;;73679:60:0;;:4;;:16;;:60;;73696:11;;73709;;73722:6;;73730:8;;73679:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73675:401;;73886:101;;;;;;;;73919:8;:15;73886:101;;;;73963:8;73953:19;;;;;;73886:101;;;73835:14;:27;73850:11;73835:27;;;;;;;;;;;;;;;73863:11;73835:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73835:48:0;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;74007:57;;;;74021:11;;74034;;73876:6;;74055:8;;74007:57;:::i;:::-;;;;;;;;73675:401;72985:1098;;;;:::o;83395:103::-;83452:4;52315:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52315:16:0;:30;;83477:12;83469:21;83395:103;-1:-1:-1;;83395:103:0:o;86085:292::-;86233:4;-1:-1:-1;;;;;;86275:41:0;;-1:-1:-1;;;86275:41:0;;:94;;;86333:36;86357:11;86333:23;:36::i;85494:122::-;70804:13;:11;:13::i;:::-;85576:14:::1;:32:::0;;-1:-1:-1;;;;;;85576:32:0::1;-1:-1:-1::0;;;;;85576:32:0;;;::::1;::::0;;;::::1;::::0;;85494:122::o;47520:100::-;47574:13;47607:5;47600:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47520:100;:::o;49033:171::-;49109:7;49129:23;49144:7;49129:14;:23::i;:::-;-1:-1:-1;49172:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;49172:24:0;;49033:171::o;48550:417::-;48631:13;48647:23;48662:7;48647:14;:23::i;:::-;48631:39;;48695:5;-1:-1:-1;;;;;48689:11:0;:2;-1:-1:-1;;;;;48689:11:0;;;48681:57;;;;-1:-1:-1;;;48681:57:0;;17290:2:1;48681:57:0;;;17272:21:1;17329:2;17309:18;;;17302:30;17368:34;17348:18;;;17341:62;-1:-1:-1;;;17419:18:1;;;17412:31;17460:19;;48681:57:0;17088:397:1;48681:57:0;42397:10;-1:-1:-1;;;;;48773:21:0;;;;:62;;-1:-1:-1;48798:37:0;48815:5;42397:10;49502:164;:::i;48798:37::-;48751:174;;;;-1:-1:-1;;;48751:174:0;;17692:2:1;48751:174:0;;;17674:21:1;17731:2;17711:18;;;17704:30;17770:34;17750:18;;;17743:62;17841:32;17821:18;;;17814:60;17891:19;;48751:174:0;17490:426:1;48751:174:0;48938:21;48947:2;48951:7;48938:8;:21::i;:::-;48620:347;48550:417;;:::o;74091:435::-;74317:10;74339:4;74317:27;74295:120;;;;-1:-1:-1;;;74295:120:0;;18123:2:1;74295:120:0;;;18105:21:1;18162:2;18142:18;;;18135:30;18201:34;18181:18;;;18174:62;-1:-1:-1;;;18252:18:1;;;18245:41;18303:19;;74295:120:0;17921:407:1;74295:120:0;74464:54;74475:11;74488;74501:6;74509:8;74464:10;:54::i;49733:336::-;49928:41;42397:10;49947:12;49961:7;49928:18;:41::i;:::-;49920:100;;;;-1:-1:-1;;;49920:100:0;;;;;;;:::i;:::-;50033:28;50043:4;50049:2;50053:7;50033:9;:28::i;83506:238::-;83689:14;;83719:7;;83624:16;;;;-1:-1:-1;;;;;83689:14:0;;;;83730:5;;83706:20;;:10;:20;:::i;:::-;83705:30;;;;:::i;:::-;83681:55;;;;83506:238;;;;;;:::o;63055:256::-;63152:7;63188:23;63205:5;63188:16;:23::i;:::-;63180:5;:31;63172:87;;;;-1:-1:-1;;;63172:87:0;;19512:2:1;63172:87:0;;;19494:21:1;19551:2;19531:18;;;19524:30;19590:34;19570:18;;;19563:62;-1:-1:-1;;;19641:18:1;;;19634:41;19692:19;;63172:87:0;19310:407:1;63172:87:0;-1:-1:-1;;;;;;63277:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;63055:256::o;85192:294::-;70804:13;:11;:13::i;:::-;85373:3:::1;85361:8;:15;;;;85339:110;;;::::0;-1:-1:-1;;;85339:110:0;;20336:2:1;85339:110:0::1;::::0;::::1;20318:21:1::0;20375:2;20355:18;;;20348:30;20414:34;20394:18;;;20387:62;-1:-1:-1;;;20465:18:1;;;20458:43;20518:19;;85339:110:0::1;20134:409:1::0;85339:110:0::1;85460:18;;:7;:18:::0;85192:294::o;84157:252::-;70804:13;:11;:13::i;:::-;84271:1:::1;84250:11;:18;:22;84242:55;;;::::0;-1:-1:-1;;;84242:55:0;;20750:2:1;84242:55:0::1;::::0;::::1;20732:21:1::0;20789:2;20769:18;;;20762:30;-1:-1:-1;;;20808:18:1;;;20801:50;20868:18;;84242:55:0::1;20548:344:1::0;84242:55:0::1;84313:9;84308:93;84332:11;:18;84328:1;:22;84308:93;;;84400:1;84370:11;:27;84382:11;84394:1;84382:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84370:27:0::1;-1:-1:-1::0;;;;;84370:27:0::1;;;;;;;;;;;;:31;;;;84352:3;;;;;:::i;:::-;;;;84308:93;;;;84157:252:::0;:::o;86796:287::-;76811:10;76833:1;76803:19;;;:7;:19;;;;;:27;76781:118;;;;-1:-1:-1;;;76781:118:0;;21371:2:1;76781:118:0;;;21353:21:1;21410:2;21390:18;;;21383:30;21449:34;21429:18;;;21422:62;-1:-1:-1;;;21500:18:1;;;21493:35;21545:19;;76781:118:0;21169:401:1;76781:118:0;86870:10:::1;86845:14;86862:19:::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;86907:10;86899:40:::1;;;::::0;-1:-1:-1;;;86899:40:0;;21777:2:1;86899:40:0::1;::::0;::::1;21759:21:1::0;21816:2;21796:18;;;21789:30;-1:-1:-1;;;21835:18:1;;;21828:47;21892:18;;86899:40:0::1;21575:341:1::0;86899:40:0::1;86958:10;86979:1;86950:19:::0;;;:7:::1;:19;::::0;;;;;:26:::1;;:30:::0;;;86991:36;;::::1;;;::::0;87020:6;;86991:36;;86979:1;86991:36;87020:6;86958:10;86991:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;87043:32:0::1;::::0;4675:25:1;;;87056:10:0::1;::::0;87043:32:::1;::::0;4663:2:1;4648:18;87043:32:0::1;;;;;;;86834:249;86796:287::o:0;85822:82::-;70804:13;:11;:13::i;:::-;85880:16:::1;85893:2;85880:12;:16::i;:::-;85822:82:::0;:::o;50140:185::-;50278:39;50295:4;50301:2;50305:7;50278:39;;;;;;;;;;;;:16;:39::i;69433:243::-;69551:41;42397:10;69570:12;42317:98;69551:41;69543:100;;;;-1:-1:-1;;;69543:100:0;;;;;;;:::i;:::-;69654:14;69660:7;69654:5;:14::i;84638:106::-;70804:13;:11;:13::i;:::-;84712:12:::1;:24:::0;84638:106::o;87614:321::-;70804:13;:11;:13::i;:::-;87766:38:::1;::::0;-1:-1:-1;;;87766:38:0;;87798:4:::1;87766:38;::::0;::::1;4147:51:1::0;87722:14:0;;87692:20:::1;::::0;-1:-1:-1;;;;;87766:23:0;::::1;::::0;::::1;::::0;4120:18:1;;87766:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87748:56;;87815:13;-1:-1:-1::0;;;;;87815:22:0::1;;87838:7;70991:6:::0;;-1:-1:-1;;;;;70991:6:0;;;;;;70918:87;87838:7:::1;87815:40;::::0;-1:-1:-1;;;;;;87815:40:0::1;::::0;;;;;;-1:-1:-1;;;;;5617:32:1;;;87815:40:0::1;::::0;::::1;5599:51:1::0;5666:18;;;5659:34;;;5572:18;;87815:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;87871:56:0::1;::::0;;-1:-1:-1;;;;;5617:32:1;;5599:51;;5681:2;5666:18;;5659:34;;;87891:10:0::1;::::0;87871:56:::1;::::0;5572:18:1;87871:56:0::1;;;;;;;87681:254;;87614:321:::0;:::o;63577:233::-;63652:7;63688:30;63475:10;:17;;63387:113;63688:30;63680:5;:38;63672:95;;;;-1:-1:-1;;;63672:95:0;;22562:2:1;63672:95:0;;;22544:21:1;22601:2;22581:18;;;22574:30;22640:34;22620:18;;;22613:62;-1:-1:-1;;;22691:18:1;;;22684:42;22743:19;;63672:95:0;22360:408:1;63672:95:0;63785:10;63796:5;63785:17;;;;;;;;:::i;:::-;;;;;;;;;63778:24;;63577:233;;;:::o;84858:104::-;70804:13;:11;:13::i;:::-;84934:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;47231:222::-:0;47303:7;47339:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47339:16:0;47374:19;47366:56;;;;-1:-1:-1;;;47366:56:0;;22975:2:1;47366:56:0;;;22957:21:1;23014:2;22994:18;;;22987:30;-1:-1:-1;;;23033:18:1;;;23026:54;23097:18;;47366:56:0;22773:348:1;84530:100:0;70804:13;:11;:13::i;:::-;44275:7;;;;84590:32:::1;;84614:8;:6;:8::i;:::-;84530:100::o:0;84590:32::-:1;84601:10;:8;:10::i;77480:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46962:207::-;47034:7;-1:-1:-1;;;;;47062:19:0;;47054:73;;;;-1:-1:-1;;;47054:73:0;;23328:2:1;47054:73:0;;;23310:21:1;23367:2;23347:18;;;23340:30;23406:34;23386:18;;;23379:62;-1:-1:-1;;;23457:18:1;;;23450:39;23506:19;;47054:73:0;23126:405:1;47054:73:0;-1:-1:-1;;;;;;47145:16:0;;;;;:9;:16;;;;;;;46962:207::o;71566:103::-;70804:13;:11;:13::i;:::-;71631:30:::1;71658:1;71631:18;:30::i;72784:51::-:0;;;;;;;;;;;;;;;;:::i;83765:384::-;70804:13;:11;:13::i;:::-;83913:1:::1;83891:12;:19;:23;83883:56;;;::::0;-1:-1:-1;;;83883:56:0;;20750:2:1;83883:56:0::1;::::0;::::1;20732:21:1::0;20789:2;20769:18;;;20762:30;-1:-1:-1;;;20808:18:1;;;20801:50;20868:18;;83883:56:0::1;20548:344:1::0;83883:56:0::1;83957:9;83952:190;83976:12;:19;83972:1;:23;83952:190;;;84052:1;-1:-1:-1::0;;;;;84025:29:0::1;:12;84038:1;84025:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84025:29:0::1;;;84017:62;;;::::0;-1:-1:-1;;;84017:62:0;;23738:2:1;84017:62:0::1;::::0;::::1;23720:21:1::0;23777:2;23757:18;;;23750:30;-1:-1:-1;;;23796:18:1;;;23789:50;23856:18;;84017:62:0::1;23536:344:1::0;84017:62:0::1;84125:5;84094:11;:28;84106:12;84119:1;84106:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84094:28:0::1;-1:-1:-1::0;;;;;84094:28:0::1;;;;;;;;;;;;:36;;;;83997:3;;;;;:::i;:::-;;;;83952:190;;85068:116:::0;70804:13;:11;:13::i;:::-;85150:26:::1;85163:7;85172:3;85150:12;:26::i;85912:165::-:0;70804:13;:11;:13::i;:::-;85997:9:::1;85992:78;86016:8;86012:1;:12;85992:78;;;86046:12;86055:2;86046:8;:12::i;:::-;86026:3:::0;::::1;::::0;::::1;:::i;:::-;;;;85992:78;;84970:90:::0;70804:13;:11;:13::i;:::-;85036:5:::1;:16:::0;84970:90::o;80710:128::-;70804:13;:11;:13::i;:::-;80795:26:::1;:35:::0;80710:128::o;47689:104::-;47745:13;47778:7;47771:14;;;;;:::i;88002:388::-;70804:13;:11;:13::i;:::-;88154:14;88122:21:::1;88180:203;88204:3;:10;88200:1;:14;88180:203;;;88236:13;-1:-1:-1::0;;;;;88236:30:0::1;;88275:4;88282:7;70991:6:::0;;-1:-1:-1;;;;;70991:6:0;;;;;;70918:87;88282:7:::1;88291:3;88295:1;88291:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;88236:62:::1;::::0;-1:-1:-1;;;;;;88236:62:0::1;::::0;;;;;;-1:-1:-1;;;;;24143:15:1;;;88236:62:0::1;::::0;::::1;24125:34:1::0;24195:15;;;;24175:18;;;24168:43;24227:18;;;24220:34;24060:18;;88236:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;88336:10;-1:-1:-1::0;;;;;88318:53:0::1;;88348:14;88364:3;88368:1;88364:6;;;;;;;;:::i;:::-;;;;;;;88318:53;;;;;;-1:-1:-1::0;;;;;5617:32:1;;;;5599:51;;5681:2;5666:18;;5659:34;5587:2;5572:18;;5425:274;88318:53:0::1;;;;;;;;88216:3:::0;::::1;::::0;::::1;:::i;:::-;;;;88180:203;;81748:933:::0;43809:19;:17;:19::i;:::-;81835:1:::1;81826:6;:10;:32;;;;;81850:8;;81840:6;:18;;81826:32;81818:68;;;::::0;-1:-1:-1;;;81818:68:0;;24467:2:1;81818:68:0::1;::::0;::::1;24449:21:1::0;24506:2;24486:18;;;24479:30;24545:25;24525:18;;;24518:53;24588:18;;81818:68:0::1;24265:347:1::0;81818:68:0::1;81948:12;;81919:21;81929:10;81919:9;:21::i;:::-;:25;::::0;81943:1:::1;81919:25;:::i;:::-;:41;;81897:119;;;::::0;-1:-1:-1;;;81897:119:0;;24952:2:1;81897:119:0::1;::::0;::::1;24934:21:1::0;24991:2;24971:18;;;24964:30;25030;25010:18;;;25003:58;25078:18;;81897:119:0::1;24750:352:1::0;81897:119:0::1;82056:6;82048:5;;:14;;;;:::i;:::-;82035:9;:27;82027:60;;;::::0;-1:-1:-1;;;82027:60:0;;25309:2:1;82027:60:0::1;::::0;::::1;25291:21:1::0;25348:2;25328:18;;;25321:30;-1:-1:-1;;;25367:18:1;;;25360:50;25427:18;;82027:60:0::1;25107:344:1::0;82027:60:0::1;82148:9;;82144:1;82135:6;82120:12;;:21;;;;:::i;:::-;:25;;;;:::i;:::-;:37;82098:128;;;::::0;-1:-1:-1;;;82098:128:0;;25788:2:1;82098:128:0::1;::::0;::::1;25770:21:1::0;25827:2;25807:18;;;25800:30;25866:34;25846:18;;;25839:62;-1:-1:-1;;;25917:18:1;;;25910:39;25966:19;;82098:128:0::1;25586:405:1::0;82098:128:0::1;82243:15;::::0;::::1;;82239:204;;;82313:10;82301:23;::::0;;;:11:::1;:23;::::0;;;;;:33;-1:-1:-1;82301:33:0::1;82275:156;;;::::0;-1:-1:-1;;;82275:156:0;;26198:2:1;82275:156:0::1;::::0;::::1;26180:21:1::0;26237:2;26217:18;;;26210:30;26276:34;26256:18;;;26249:62;26347:31;26327:18;;;26320:59;26396:19;;82275:156:0::1;25996:425:1::0;82275:156:0::1;82460:9;82455:186;82479:6;82475:1;:10;82455:186;;;82507:24;82520:10;82507:12;:24::i;:::-;82550:15;::::0;::::1;;82546:84;;;82598:10;82586:23;::::0;;;:11:::1;:23;::::0;;;;:28;;82613:1:::1;::::0;82586:23;:28:::1;::::0;82613:1;;82586:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;82546:84:0::1;82487:3:::0;::::1;::::0;::::1;:::i;:::-;;;;82455:186;;;;82653:20;82663:9;82653;:20::i;49276:155::-:0;49371:52;42397:10;49404:8;49414;49371:18;:52::i;50396:323::-;50570:41;42397:10;50603:7;50570:18;:41::i;:::-;50562:100;;;;-1:-1:-1;;;50562:100:0;;;;;;;:::i;:::-;50673:38;50687:4;50693:2;50697:7;50706:4;50673:13;:38::i;84417:105::-;70804:13;:11;:13::i;:::-;84499:15:::1;::::0;;-1:-1:-1;;84480:34:0;::::1;84499:15;::::0;;::::1;84498:16;84480:34;::::0;;84417:105::o;77508:37::-;;;;;;;:::i;84752:98::-;70804:13;:11;:13::i;:::-;84822:8:::1;:20:::0;84752:98::o;82689:196::-;82816:13;82854:23;82869:7;82854:14;:23::i;78931:1695::-;79051:16;79059:7;79051;:16::i;:::-;-1:-1:-1;;;;;79037:30:0;:10;-1:-1:-1;;;;;79037:30:0;;79015:114;;;;-1:-1:-1;;;79015:114:0;;26628:2:1;79015:114:0;;;26610:21:1;26667:2;26647:18;;;26640:30;26706:34;26686:18;;;26679:62;-1:-1:-1;;;26757:18:1;;;26750:32;26799:19;;79015:114:0;26426:398:1;79015:114:0;79162:29;;;79201:1;79162:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;79140:136;;;;-1:-1:-1;;;79140:136:0;;27031:2:1;79140:136:0;;;27013:21:1;27070:2;27050:18;;;27043:30;27109:34;27089:18;;;27082:62;-1:-1:-1;;;27160:18:1;;;27153:44;27214:19;;79140:136:0;26829:410:1;79140:136:0;79356:14;79362:7;79356:5;:14::i;:::-;79467:31;;;79478:10;79467:31;;;5599:51:1;5666:18;;;5659:34;;;79467:31:0;;;;;;;;;5572:18:1;;;79467:31:0;;79695:26;;-1:-1:-1;;;79642:90:0;;;27399:51:1;27466:11;;;;27459:27;;;;79642:90:0;;;;;;;;;;27502:12:1;;;79642:90:0;;;;79911:8;;-1:-1:-1;;;79911:153:0;;;79467:31;;79601:1;;-1:-1:-1;;;;;;;79911:8:0;;:21;;:153;;79947:8;;79978:4;;79467:31;;-1:-1:-1;;79642:90:0;;79911:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79886:178;;;80112:10;80099:9;:23;;80077:147;;;;-1:-1:-1;;;80077:147:0;;28624:2:1;80077:147:0;;;28606:21:1;28663:2;28643:18;;;28636:30;28702:34;28682:18;;;28675:62;28773:34;28753:18;;;28746:62;-1:-1:-1;;;28824:19:1;;;28817:41;28875:19;;80077:147:0;28422:478:1;80077:147:0;80237:8;;80329:29;;;80237:8;80329:29;;;:19;:29;;;;;;80237:381;;-1:-1:-1;;;80237:381:0;;-1:-1:-1;;;;;80237:8:0;;;;:13;;80258:9;;80237:381;;80283:8;;80412:7;;80468:10;;80237:8;80578:13;;80237:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79004:1622;;;;78931:1695;;:::o;75186:916::-;75445:27;;;75410:32;75445:27;;;:14;:27;;;;;;:64;;;;75487:11;;75445:64;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75445:72:0;;;;;;;;;;75550:21;;;;75445:72;;-1:-1:-1;75528:123:0;;;;-1:-1:-1;;;75528:123:0;;30596:2:1;75528:123:0;;;30578:21:1;30635:2;30615:18;;;30608:30;30674:34;30654:18;;;30647:62;-1:-1:-1;;;30725:18:1;;;30718:36;30771:19;;75528:123:0;30394:402:1;75528:123:0;75703:23;;75684:42;;:107;;;;;75770:9;:21;;;75757:8;;75747:19;;;;;;;:::i;:::-;;;;;;;;:44;75684:107;75662:183;;;;-1:-1:-1;;;75662:183:0;;31279:2:1;75662:183:0;;;31261:21:1;31318:2;31298:18;;;31291:30;31357:28;31337:18;;;31330:56;31403:18;;75662:183:0;31077:350:1;75662:183:0;75919:1;75893:27;;;75931:21;;;:34;76034:60;;-1:-1:-1;;;76034:60:0;;:4;;:16;;:60;;76051:11;;76064;;76077:6;;76085:8;;;;76034:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75354:748;75186:916;;;;;:::o;82893:494::-;82947:16;82976:18;82997:17;83007:6;82997:9;:17::i;:::-;82976:38;-1:-1:-1;83029:15:0;83025:355;;83068:16;;;83082:1;83068:16;;;;;;;;;;;-1:-1:-1;83061:23:0;82893:494;-1:-1:-1;;;82893:494:0:o;83025:355::-;83117:23;83157:10;-1:-1:-1;;;;;83143:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83143:25:0;;83117:51;;83183:13;83211:130;83235:10;83227:5;:18;83211:130;;;83291:34;83311:6;83319:5;83291:19;:34::i;:::-;83275:6;83282:5;83275:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;83247:7;;;;:::i;:::-;;;;83211:130;;83025:355;82965:422;82893:494;;;:::o;87163:407::-;70804:13;:11;:13::i;:::-;87239:21:::1;87279:10:::0;87271:40:::1;;;::::0;-1:-1:-1;;;87271:40:0;;21777:2:1;87271:40:0::1;::::0;::::1;21759:21:1::0;21816:2;21796:18;;;21789:30;-1:-1:-1;;;21835:18:1;;;21828:47;21892:18;;87271:40:0::1;21575:341:1::0;87271:40:0::1;87327:7;87322:146;87344:7;:14:::0;87340:18:::1;::::0;::::1;;87322:146;;;87380:18;87401:7;87409:1;87401:10;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;87401:10:0::1;87426:19:::0;;:7:::1;:19:::0;;;;;87401:10;87426:26:::1;:30:::0;-1:-1:-1;87360:3:0;::::1;::::0;::::1;:::i;:::-;;;;87322:146;;;-1:-1:-1::0;87478:36:0::1;::::0;87486:10:::1;::::0;87478:36;::::1;;;::::0;87507:6;;87478:36:::1;::::0;;;87507:6;87486:10;87478:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;76110:181:::0;70804:13;:11;:13::i;:::-;76237:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;76269:14;;76237:46:::1;:::i;71824:201::-:0;70804:13;:11;:13::i;:::-;-1:-1:-1;;;;;71913:22:0;::::1;71905:73;;;::::0;-1:-1:-1;;;71905:73:0;;32537:2:1;71905:73:0::1;::::0;::::1;32519:21:1::0;32576:2;32556:18;;;32549:30;32615:34;32595:18;;;32588:62;-1:-1:-1;;;32666:18:1;;;32659:36;32712:19;;71905:73:0::1;32335:402:1::0;71905:73:0::1;71989:28;72008:8;71989:18;:28::i;62747:224::-:0;62849:4;-1:-1:-1;;;;;;62873:50:0;;-1:-1:-1;;;62873:50:0;;:90;;;62927:36;62951:11;62927:23;:36::i;71083:132::-;70991:6;;-1:-1:-1;;;;;70991:6:0;;;;;42397:10;71147:23;71139:68;;;;-1:-1:-1;;;71139:68:0;;32944:2:1;71139:68:0;;;32926:21:1;;;32963:18;;;32956:30;33022:34;33002:18;;;32995:62;33074:18;;71139:68:0;32742:356:1;57008:135:0;52291:4;52315:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52315:16:0;57082:53;;;;-1:-1:-1;;;57082:53:0;;22975:2:1;57082:53:0;;;22957:21:1;23014:2;22994:18;;;22987:30;-1:-1:-1;;;23033:18:1;;;23026:54;23097:18;;57082:53:0;22773:348:1;56287:174:0;56362:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;56362:29:0;-1:-1:-1;;;;;56362:29:0;;;;;;;;:24;;56416:23;56362:24;56416:14;:23::i;:::-;-1:-1:-1;;;;;56407:46:0;;;;;;;;;;;56287:174;;:::o;80846:424::-;81042:14;81058:15;81102:8;81077:77;;;;;;;;;;;;:::i;:::-;81041:113;;;;81236:26;81246:6;81254:7;81236:9;:26::i;:::-;81011:259;;80846:424;;;;:::o;52520:264::-;52613:4;52630:13;52646:23;52661:7;52646:14;:23::i;:::-;52630:39;;52699:5;-1:-1:-1;;;;;52688:16:0;:7;-1:-1:-1;;;;;52688:16:0;;:52;;;-1:-1:-1;;;;;;49623:25:0;;;49599:4;49623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52708:32;52688:87;;;;52768:7;-1:-1:-1;;;;;52744:31:0;:20;52756:7;52744:11;:20::i;:::-;-1:-1:-1;;;;;52744:31:0;;52688:87;52680:96;52520:264;-1:-1:-1;;;;52520:264:0:o;55543:625::-;55702:4;-1:-1:-1;;;;;55675:31:0;:23;55690:7;55675:14;:23::i;:::-;-1:-1:-1;;;;;55675:31:0;;55667:81;;;;-1:-1:-1;;;55667:81:0;;33630:2:1;55667:81:0;;;33612:21:1;33669:2;33649:18;;;33642:30;33708:34;33688:18;;;33681:62;-1:-1:-1;;;33759:18:1;;;33752:35;33804:19;;55667:81:0;33428:401:1;55667:81:0;-1:-1:-1;;;;;55767:16:0;;55759:65;;;;-1:-1:-1;;;55759:65:0;;34036:2:1;55759:65:0;;;34018:21:1;34075:2;34055:18;;;34048:30;34114:34;34094:18;;;34087:62;-1:-1:-1;;;34165:18:1;;;34158:34;34209:19;;55759:65:0;33834:400:1;55759:65:0;55837:39;55858:4;55864:2;55868:7;55837:20;:39::i;:::-;55941:29;55958:1;55962:7;55941:8;:29::i;:::-;-1:-1:-1;;;;;55983:15:0;;;;;;:9;:15;;;;;:20;;56002:1;;55983:15;:20;;56002:1;;55983:20;:::i;:::-;;;;-1:-1:-1;;;;;;;56014:13:0;;;;;;:9;:13;;;;;:18;;56031:1;;56014:13;:18;;56031:1;;56014:18;:::i;:::-;;;;-1:-1:-1;;56043:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;56043:21:0;-1:-1:-1;;;;;56043:21:0;;;;;;;;;56082:27;;56043:16;;56082:27;;;;;;;48620:347;48550:417;;:::o;85643:171::-;85697:15;85736:9;;85715:18;:16;:18::i;:::-;:30;;;;:::i;:::-;85697:48;;85772:1;85756:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;85784:22:0;;-1:-1:-1;85794:2:0;85798:7;85784:9;:22::i;86622:138::-;86732:20;86744:7;86732:11;:20::i;44800:118::-;43809:19;:17;:19::i;:::-;44860:7:::1;:14:::0;;-1:-1:-1;;44860:14:0::1;44870:4;44860:14;::::0;;44890:20:::1;44897:12;42397:10:::0;;42317:98;44897:12:::1;44890:20;::::0;-1:-1:-1;;;;;4165:32:1;;;4147:51;;4135:2;4120:18;44890:20:0::1;;;;;;;44800:118::o:0;45059:120::-;44068:16;:14;:16::i;:::-;45118:7:::1;:15:::0;;-1:-1:-1;;45118:15:0::1;::::0;;45149:22:::1;42397:10:::0;45158:12:::1;42317:98:::0;72185:191;72278:6;;;-1:-1:-1;;;;;72295:17:0;;;72278:6;72295:17;;;-1:-1:-1;;;;;;72295:17:0;;;;;;72328:40;;72278:6;;;;;;;;72328:40;;72259:16;;72328:40;72248:128;72185:191;:::o;61081:217::-;52291:4;52315:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52315:16:0;61173:75;;;;-1:-1:-1;;;61173:75:0;;34441:2:1;61173:75:0;;;34423:21:1;34480:2;34460:18;;;34453:30;34519:34;34499:18;;;34492:62;-1:-1:-1;;;34570:18:1;;;34563:44;34624:19;;61173:75:0;34239:410:1;61173:75:0;61259:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;44363:108::-;44275:7;;;;44433:9;44425:38;;;;-1:-1:-1;;;44425:38:0;;34856:2:1;44425:38:0;;;34838:21:1;34895:2;34875:18;;;34868:30;-1:-1:-1;;;34914:18:1;;;34907:46;34970:18;;44425:38:0;34654:340:1;81386:354:0;81450:7;81445:288;81467:7;:14;81463:18;;;;81445:288;;;81503:18;81524:7;81532:1;81524:10;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;81524:10:0;81566:19;;;:7;:19;;;;;;:27;81524:10;;-1:-1:-1;81566:27:0;81631:33;81658:5;81631:22;:10;81566:27;81631:14;:22::i;:::-;:26;;:33::i;:::-;-1:-1:-1;;;;;81679:19:0;;;;;;:7;:19;;;;;:26;;:42;;81608:56;;-1:-1:-1;81608:56:0;;81679:26;;:19;:42;;81608:56;;81679:42;:::i;:::-;;;;;;;;81488:245;;;81483:3;;;;;:::i;:::-;;;;81445:288;;56604:315;56759:8;-1:-1:-1;;;;;56750:17:0;:5;-1:-1:-1;;;;;56750:17:0;;;56742:55;;;;-1:-1:-1;;;56742:55:0;;35201:2:1;56742:55:0;;;35183:21:1;35240:2;35220:18;;;35213:30;35279:27;35259:18;;;35252:55;35324:18;;56742:55:0;34999:349:1;56742:55:0;-1:-1:-1;;;;;56808:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56808:46:0;;;;;;;;;;56870:41;;2315::1;;;56870::0;;2288:18:1;56870:41:0;;;;;;;56604:315;;;:::o;51600:313::-;51756:28;51766:4;51772:2;51776:7;51756:9;:28::i;:::-;51803:47;51826:4;51832:2;51836:7;51845:4;51803:22;:47::i;:::-;51795:110;;;;-1:-1:-1;;;51795:110:0;;;;;;;:::i;60301:624::-;60374:13;60400:23;60415:7;60400:14;:23::i;:::-;60436;60462:19;;;:10;:19;;;;;60436:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60492:18;60513:10;:8;:10::i;:::-;60492:31;;60605:4;60599:18;60621:1;60599:23;60595:72;;;-1:-1:-1;60646:9:0;60301:624;-1:-1:-1;;60301:624:0:o;60595:72::-;60771:23;;:27;60767:108;;60846:4;60852:9;60829:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60815:48;;;;60301:624;;;:::o;60767:108::-;60894:23;60909:7;60894:14;:23::i;46593:305::-;46695:4;-1:-1:-1;;;;;;46732:40:0;;-1:-1:-1;;;46732:40:0;;:105;;-1:-1:-1;;;;;;;46789:48:0;;-1:-1:-1;;;46789:48:0;46732:105;:158;;;-1:-1:-1;;;;;;;;;;34816:40:0;;;46854:36;34707:157;53126:110;53202:26;53212:2;53216:7;53202:26;;;;;;;;;;;;:9;:26::i;86385:229::-;43809:19;:17;:19::i;:::-;86561:45:::1;86588:4;86594:2;86598:7;86561:26;:45::i;553:786::-:0;607:7;627:13;655:11;;643:9;:23;;;;:::i;:::-;627:39;;677:12;700:14;727:9;756:5;739:14;:12;:14::i;:::-;:22;;;;:::i;:::-;727:34;-1:-1:-1;840:11:0;:22;852:9;860:1;852:5;:9;:::i;:::-;840:22;;;;;;;;;;;;866:1;840:27;836:138;;;891:9;899:1;891:5;:9;:::i;:::-;884:16;;836:138;;;940:11;:22;952:9;960:1;952:5;:9;:::i;:::-;940:22;;;;;;;;;;;;933:29;;836:138;1098:14;;;;:11;:14;;;;;;1094:190;;1159:14;;;;:11;:14;;;;;:21;;;1143:1;-1:-1:-1;1143:1:0;1094:190;;;1222:14;;;;:11;:14;;;;;;;1251:21;;;;1222:14;-1:-1:-1;1094:190:0;1294:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;1325:6:0;;553:786;-1:-1:-1;;;;;553:786:0:o;61523:206::-;61592:20;61604:7;61592:11;:20::i;:::-;61635:19;;;;:10;:19;;;;;61629:33;;;;;:::i;:::-;:38;;-1:-1:-1;61625:97:0;;61691:19;;;;:10;:19;;;;;61684:26;;;:::i;44548:108::-;44275:7;;;;44607:41;;;;-1:-1:-1;;;44607:41:0;;36566:2:1;44607:41:0;;;36548:21:1;36605:2;36585:18;;;36578:30;-1:-1:-1;;;36624:18:1;;;36617:50;36684:18;;44607:41:0;36364:344:1;16496:98:0;16554:7;16581:5;16585:1;16581;:5;:::i;:::-;16574:12;16496:98;-1:-1:-1;;;16496:98:0:o;16895:::-;16953:7;16980:5;16984:1;16980;:5;:::i;57707:853::-;57861:4;-1:-1:-1;;;;;57882:13:0;;23948:19;:23;57878:675;;57918:71;;-1:-1:-1;;;57918:71:0;;-1:-1:-1;;;;;57918:36:0;;;;;:71;;42397:10;;57969:4;;57975:7;;57984:4;;57918:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57918:71:0;;;;;;;;-1:-1:-1;;57918:71:0;;;;;;;;;;;;:::i;:::-;;;57914:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58159:13:0;;58155:328;;58202:60;;-1:-1:-1;;;58202:60:0;;;;;;;:::i;58155:328::-;58433:6;58427:13;58418:6;58414:2;58410:15;58403:38;57914:584;-1:-1:-1;;;;;;58040:51:0;-1:-1:-1;;;58040:51:0;;-1:-1:-1;58033:58:0;;57878:675;-1:-1:-1;58537:4:0;57707:853;;;;;;:::o;81278:100::-;81330:13;81363:7;81356:14;;;;;:::i;47864:281::-;47937:13;47963:23;47978:7;47963:14;:23::i;:::-;47999:21;48023:10;:8;:10::i;:::-;47999:34;;48075:1;48057:7;48051:21;:25;:86;;;;;;;;;;;;;;;;;48103:7;48112:18;:7;:16;:18::i;:::-;48086:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48044:93;47864:281;-1:-1:-1;;;47864:281:0:o;53463:319::-;53592:18;53598:2;53602:7;53592:5;:18::i;:::-;53643:53;53674:1;53678:2;53682:7;53691:4;53643:22;:53::i;:::-;53621:153;;;;-1:-1:-1;;;53621:153:0;;;;;;;:::i;64423:589::-;-1:-1:-1;;;;;64629:18:0;;64625:187;;64664:40;64696:7;65839:10;:17;;65812:24;;;;:15;:24;;;;;:44;;;65867:24;;;;;;;;;;;;65735:164;64664:40;64625:187;;;64734:2;-1:-1:-1;;;;;64726:10:0;:4;-1:-1:-1;;;;;64726:10:0;;64722:90;;64753:47;64786:4;64792:7;64753:32;:47::i;:::-;-1:-1:-1;;;;;64826:16:0;;64822:183;;64859:45;64896:7;64859:36;:45::i;64822:183::-;64932:4;-1:-1:-1;;;;;64926:10:0;:2;-1:-1:-1;;;;;64926:10:0;;64922:83;;64953:40;64981:2;64985:7;64953:27;:40::i;1347:198::-;1394:7;1487:16;1505:15;1470:51;;;;;;;;37618:19:1;;;37662:2;37653:12;;37646:28;37699:2;37690:12;;37461:247;1470:51:0;;;;;;;;;;;;;1460:62;;;;;;1434:103;;1414:123;;1347:198;:::o;54786:420::-;54846:13;54862:23;54877:7;54862:14;:23::i;:::-;54846:39;;54898:48;54919:5;54934:1;54938:7;54898:20;:48::i;:::-;54987:29;55004:1;55008:7;54987:8;:29::i;:::-;-1:-1:-1;;;;;55029:16:0;;;;;;:9;:16;;;;;:21;;55049:1;;55029:16;:21;;55049:1;;55029:21;:::i;:::-;;;;-1:-1:-1;;55068:16:0;;;;:7;:16;;;;;;55061:23;;-1:-1:-1;;;;;;55061:23:0;;;55102:36;55076:7;;55068:16;-1:-1:-1;;;;;55102:36:0;;;;;55068:16;;55102:36;84308:93:::1;84157:252:::0;:::o;20353:723::-;20409:13;20630:10;20626:53;;-1:-1:-1;;20657:10:0;;;;;;;;;;;;-1:-1:-1;;;20657:10:0;;;;;20353:723::o;20626:53::-;20704:5;20689:12;20745:78;20752:9;;20745:78;;20778:8;;;;:::i;:::-;;-1:-1:-1;20801:10:0;;-1:-1:-1;20809:2:0;20801:10;;:::i;:::-;;;20745:78;;;20833:19;20865:6;-1:-1:-1;;;;;20855:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20855:17:0;;20833:39;;20883:154;20890:10;;20883:154;;20917:11;20927:1;20917:11;;:::i;:::-;;-1:-1:-1;20986:10:0;20994:2;20986:5;:10;:::i;:::-;20973:24;;:2;:24;:::i;:::-;20960:39;;20943:6;20950;20943:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20943:56:0;;;;;;;;-1:-1:-1;21014:11:0;21023:2;21014:11;;:::i;:::-;;;20883:154;;54118:439;-1:-1:-1;;;;;54198:16:0;;54190:61;;;;-1:-1:-1;;;54190:61:0;;37915:2:1;54190:61:0;;;37897:21:1;;;37934:18;;;37927:30;37993:34;37973:18;;;37966:62;38045:18;;54190:61:0;37713:356:1;54190:61:0;52291:4;52315:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52315:16:0;:30;54262:58;;;;-1:-1:-1;;;54262:58:0;;38276:2:1;54262:58:0;;;38258:21:1;38315:2;38295:18;;;38288:30;38354;38334:18;;;38327:58;38402:18;;54262:58:0;38074:352:1;54262:58:0;54333:45;54362:1;54366:2;54370:7;54333:20;:45::i;:::-;-1:-1:-1;;;;;54391:13:0;;;;;;:9;:13;;;;;:18;;54408:1;;54391:13;:18;;54408:1;;54391:18;:::i;:::-;;;;-1:-1:-1;;54420:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;54420:21:0;-1:-1:-1;;;;;54420:21:0;;;;;;;;54459:33;;54420:16;;;54459:33;;54420:16;;54459:33;84308:93:::1;84157:252:::0;:::o;66526:988::-;66792:22;66842:1;66817:22;66834:4;66817:16;:22::i;:::-;:26;;;;:::i;:::-;66854:18;66875:26;;;:17;:26;;;;;;66792:51;;-1:-1:-1;67008:28:0;;;67004:328;;-1:-1:-1;;;;;67075:18:0;;67053:19;67075:18;;;:12;:18;;;;;;;;:34;;;;;;;;;67126:30;;;;;;:44;;;67243:30;;:17;:30;;;;;:43;;;67004:328;-1:-1:-1;67428:26:0;;;;:17;:26;;;;;;;;67421:33;;;-1:-1:-1;;;;;67472:18:0;;;;;:12;:18;;;;;:34;;;;;;;67465:41;66526:988::o;67809:1079::-;68087:10;:17;68062:22;;68087:21;;68107:1;;68087:21;:::i;:::-;68119:18;68140:24;;;:15;:24;;;;;;68513:10;:26;;68062:46;;-1:-1:-1;68140:24:0;;68062:46;;68513:26;;;;;;:::i;:::-;;;;;;;;;68491:48;;68577:11;68552:10;68563;68552:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;68657:28;;;:15;:28;;;;;;;:41;;;68829:24;;;;;68822:31;68864:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;67880:1008;;;67809:1079;:::o;65313:221::-;65398:14;65415:20;65432:2;65415:16;:20::i;:::-;-1:-1:-1;;;;;65446:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;65491:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;65313:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:127::-;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:275;381:2;375:9;446:2;427:13;;-1:-1:-1;;423:27:1;411:40;;-1:-1:-1;;;;;466:34:1;;502:22;;;463:62;460:88;;;528:18;;:::i;:::-;564:2;557:22;310:275;;-1:-1:-1;310:275:1:o;590:530::-;632:5;685:3;678:4;670:6;666:17;662:27;652:55;;703:1;700;693:12;652:55;739:6;726:20;-1:-1:-1;;;;;761:2:1;758:26;755:52;;;787:18;;:::i;:::-;831:55;874:2;855:13;;-1:-1:-1;;851:27:1;880:4;847:38;831:55;:::i;:::-;911:2;902:7;895:19;957:3;950:4;945:2;937:6;933:15;929:26;926:35;923:55;;;974:1;971;964:12;923:55;1039:2;1032:4;1024:6;1020:17;1013:4;1004:7;1000:18;987:55;1087:1;1062:16;;;1080:4;1058:27;1051:38;;;;1066:7;590:530;-1:-1:-1;;;590:530:1:o;1125:171::-;1192:20;;-1:-1:-1;;;;;1241:30:1;;1231:41;;1221:69;;1286:1;1283;1276:12;1301:684;1403:6;1411;1419;1427;1480:3;1468:9;1459:7;1455:23;1451:33;1448:53;;;1497:1;1494;1487:12;1448:53;1520:28;1538:9;1520:28;:::i;:::-;1510:38;;1599:2;1588:9;1584:18;1571:32;-1:-1:-1;;;;;1663:2:1;1655:6;1652:14;1649:34;;;1679:1;1676;1669:12;1649:34;1702:49;1743:7;1734:6;1723:9;1719:22;1702:49;:::i;:::-;1692:59;;1770:37;1803:2;1792:9;1788:18;1770:37;:::i;:::-;1760:47;;1860:2;1849:9;1845:18;1832:32;1816:48;;1889:2;1879:8;1876:16;1873:36;;;1905:1;1902;1895:12;1873:36;;1928:51;1971:7;1960:8;1949:9;1945:24;1928:51;:::i;:::-;1918:61;;;1301:684;;;;;;;:::o;1990:180::-;2049:6;2102:2;2090:9;2081:7;2077:23;2073:32;2070:52;;;2118:1;2115;2108:12;2070:52;-1:-1:-1;2141:23:1;;1990:180;-1:-1:-1;1990:180:1:o;2367:131::-;-1:-1:-1;;;;;;2441:32:1;;2431:43;;2421:71;;2488:1;2485;2478:12;2503:245;2561:6;2614:2;2602:9;2593:7;2589:23;2585:32;2582:52;;;2630:1;2627;2620:12;2582:52;2669:9;2656:23;2688:30;2712:5;2688:30;:::i;2753:131::-;-1:-1:-1;;;;;2828:31:1;;2818:42;;2808:70;;2874:1;2871;2864:12;2889:247;2948:6;3001:2;2989:9;2980:7;2976:23;2972:32;2969:52;;;3017:1;3014;3007:12;2969:52;3056:9;3043:23;3075:31;3100:5;3075:31;:::i;3141:258::-;3213:1;3223:113;3237:6;3234:1;3231:13;3223:113;;;3313:11;;;3307:18;3294:11;;;3287:39;3259:2;3252:10;3223:113;;;3354:6;3351:1;3348:13;3345:48;;;-1:-1:-1;;3389:1:1;3371:16;;3364:27;3141:258::o;3404:::-;3446:3;3484:5;3478:12;3511:6;3506:3;3499:19;3527:63;3583:6;3576:4;3571:3;3567:14;3560:4;3553:5;3549:16;3527:63;:::i;:::-;3644:2;3623:15;-1:-1:-1;;3619:29:1;3610:39;;;;3651:4;3606:50;;3404:258;-1:-1:-1;;3404:258:1:o;3667:220::-;3816:2;3805:9;3798:21;3779:4;3836:45;3877:2;3866:9;3862:18;3854:6;3836:45;:::i;4209:315::-;4277:6;4285;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4393:9;4380:23;4412:31;4437:5;4412:31;:::i;:::-;4462:5;4514:2;4499:18;;;;4486:32;;-1:-1:-1;;;4209:315:1:o;4711:456::-;4788:6;4796;4804;4857:2;4845:9;4836:7;4832:23;4828:32;4825:52;;;4873:1;4870;4863:12;4825:52;4912:9;4899:23;4931:31;4956:5;4931:31;:::i;:::-;4981:5;-1:-1:-1;5038:2:1;5023:18;;5010:32;5051:33;5010:32;5051:33;:::i;:::-;4711:456;;5103:7;;-1:-1:-1;;;5157:2:1;5142:18;;;;5129:32;;4711:456::o;5172:248::-;5240:6;5248;5301:2;5289:9;5280:7;5276:23;5272:32;5269:52;;;5317:1;5314;5307:12;5269:52;-1:-1:-1;;5340:23:1;;;5410:2;5395:18;;;5382:32;;-1:-1:-1;5172:248:1:o;5704:184::-;5762:6;5815:2;5803:9;5794:7;5790:23;5786:32;5783:52;;;5831:1;5828;5821:12;5783:52;5854:28;5872:9;5854:28;:::i;5893:183::-;5953:4;-1:-1:-1;;;;;5978:6:1;5975:30;5972:56;;;6008:18;;:::i;:::-;-1:-1:-1;6053:1:1;6049:14;6065:4;6045:25;;5893:183::o;6081:737::-;6135:5;6188:3;6181:4;6173:6;6169:17;6165:27;6155:55;;6206:1;6203;6196:12;6155:55;6242:6;6229:20;6268:4;6292:60;6308:43;6348:2;6308:43;:::i;:::-;6292:60;:::i;:::-;6386:15;;;6472:1;6468:10;;;;6456:23;;6452:32;;;6417:12;;;;6496:15;;;6493:35;;;6524:1;6521;6514:12;6493:35;6560:2;6552:6;6548:15;6572:217;6588:6;6583:3;6580:15;6572:217;;;6668:3;6655:17;6685:31;6710:5;6685:31;:::i;:::-;6729:18;;6767:12;;;;6605;;6572:217;;;-1:-1:-1;6807:5:1;6081:737;-1:-1:-1;;;;;;6081:737:1:o;6823:348::-;6907:6;6960:2;6948:9;6939:7;6935:23;6931:32;6928:52;;;6976:1;6973;6966:12;6928:52;7016:9;7003:23;-1:-1:-1;;;;;7041:6:1;7038:30;7035:50;;;7081:1;7078;7071:12;7035:50;7104:61;7157:7;7148:6;7137:9;7133:22;7104:61;:::i;7176:321::-;7245:6;7298:2;7286:9;7277:7;7273:23;7269:32;7266:52;;;7314:1;7311;7304:12;7266:52;7354:9;7341:23;-1:-1:-1;;;;;7379:6:1;7376:30;7373:50;;;7419:1;7416;7409:12;7373:50;7442:49;7483:7;7474:6;7463:9;7459:22;7442:49;:::i;7725:416::-;7818:6;7826;7879:2;7867:9;7858:7;7854:23;7850:32;7847:52;;;7895:1;7892;7885:12;7847:52;7935:9;7922:23;-1:-1:-1;;;;;7960:6:1;7957:30;7954:50;;;8000:1;7997;7990:12;7954:50;8023:61;8076:7;8067:6;8056:9;8052:22;8023:61;:::i;:::-;8013:71;8131:2;8116:18;;;;8103:32;;-1:-1:-1;;;;7725:416:1:o;8146:389::-;8224:6;8232;8285:2;8273:9;8264:7;8260:23;8256:32;8253:52;;;8301:1;8298;8291:12;8253:52;8337:9;8324:23;8314:33;;8398:2;8387:9;8383:18;8370:32;-1:-1:-1;;;;;8417:6:1;8414:30;8411:50;;;8457:1;8454;8447:12;8411:50;8480:49;8521:7;8512:6;8501:9;8497:22;8480:49;:::i;:::-;8470:59;;;8146:389;;;;;:::o;8540:460::-;8625:6;8633;8641;8694:2;8682:9;8673:7;8669:23;8665:32;8662:52;;;8710:1;8707;8700:12;8662:52;8733:28;8751:9;8733:28;:::i;:::-;8723:38;;8812:2;8801:9;8797:18;8784:32;-1:-1:-1;;;;;8831:6:1;8828:30;8825:50;;;8871:1;8868;8861:12;8825:50;8894:49;8935:7;8926:6;8915:9;8911:22;8894:49;:::i;:::-;8884:59;;;8990:2;8979:9;8975:18;8962:32;8952:42;;8540:460;;;;;:::o;9258:1026::-;9351:6;9359;9412:2;9400:9;9391:7;9387:23;9383:32;9380:52;;;9428:1;9425;9418:12;9380:52;9467:9;9454:23;9486:31;9511:5;9486:31;:::i;:::-;9536:5;-1:-1:-1;9560:2:1;9598:18;;;9585:32;-1:-1:-1;;;;;9629:30:1;;9626:50;;;9672:1;9669;9662:12;9626:50;9695:22;;9748:4;9740:13;;9736:27;-1:-1:-1;9726:55:1;;9777:1;9774;9767:12;9726:55;9813:2;9800:16;9836:60;9852:43;9892:2;9852:43;:::i;9836:60::-;9930:15;;;10012:1;10008:10;;;;10000:19;;9996:28;;;9961:12;;;;10036:19;;;10033:39;;;10068:1;10065;10058:12;10033:39;10092:11;;;;10112:142;10128:6;10123:3;10120:15;10112:142;;;10194:17;;10182:30;;10145:12;;;;10232;;;;10112:142;;;10273:5;10263:15;;;;;;;9258:1026;;;;;:::o;10289:118::-;10375:5;10368:13;10361:21;10354:5;10351:32;10341:60;;10397:1;10394;10387:12;10412:382;10477:6;10485;10538:2;10526:9;10517:7;10513:23;10509:32;10506:52;;;10554:1;10551;10544:12;10506:52;10593:9;10580:23;10612:31;10637:5;10612:31;:::i;:::-;10662:5;-1:-1:-1;10719:2:1;10704:18;;10691:32;10732:30;10691:32;10732:30;:::i;:::-;10781:7;10771:17;;;10412:382;;;;;:::o;10799:665::-;10894:6;10902;10910;10918;10971:3;10959:9;10950:7;10946:23;10942:33;10939:53;;;10988:1;10985;10978:12;10939:53;11027:9;11014:23;11046:31;11071:5;11046:31;:::i;:::-;11096:5;-1:-1:-1;11153:2:1;11138:18;;11125:32;11166:33;11125:32;11166:33;:::i;:::-;11218:7;-1:-1:-1;11272:2:1;11257:18;;11244:32;;-1:-1:-1;11327:2:1;11312:18;;11299:32;-1:-1:-1;;;;;11343:30:1;;11340:50;;;11386:1;11383;11376:12;11340:50;11409:49;11450:7;11441:6;11430:9;11426:22;11409:49;:::i;11469:252::-;11536:6;11544;11597:2;11585:9;11576:7;11572:23;11568:32;11565:52;;;11613:1;11610;11603:12;11565:52;11636:28;11654:9;11636:28;:::i;11726:347::-;11777:8;11787:6;11841:3;11834:4;11826:6;11822:17;11818:27;11808:55;;11859:1;11856;11849:12;11808:55;-1:-1:-1;11882:20:1;;-1:-1:-1;;;;;11914:30:1;;11911:50;;;11957:1;11954;11947:12;11911:50;11994:4;11986:6;11982:17;11970:29;;12046:3;12039:4;12030:6;12022;12018:19;12014:30;12011:39;12008:59;;;12063:1;12060;12053:12;12078:773;12182:6;12190;12198;12206;12214;12267:3;12255:9;12246:7;12242:23;12238:33;12235:53;;;12284:1;12281;12274:12;12235:53;12307:28;12325:9;12307:28;:::i;:::-;12297:38;;12386:2;12375:9;12371:18;12358:32;-1:-1:-1;;;;;12450:2:1;12442:6;12439:14;12436:34;;;12466:1;12463;12456:12;12436:34;12489:49;12530:7;12521:6;12510:9;12506:22;12489:49;:::i;:::-;12479:59;;12557:37;12590:2;12579:9;12575:18;12557:37;:::i;:::-;12547:47;;12647:2;12636:9;12632:18;12619:32;12603:48;;12676:2;12666:8;12663:16;12660:36;;;12692:1;12689;12682:12;12660:36;;12731:60;12783:7;12772:8;12761:9;12757:24;12731:60;:::i;:::-;12078:773;;;;-1:-1:-1;12078:773:1;;-1:-1:-1;12810:8:1;;12705:86;12078:773;-1:-1:-1;;;12078:773:1:o;12856:632::-;13027:2;13079:21;;;13149:13;;13052:18;;;13171:22;;;12998:4;;13027:2;13250:15;;;;13224:2;13209:18;;;12998:4;13293:169;13307:6;13304:1;13301:13;13293:169;;;13368:13;;13356:26;;13437:15;;;;13402:12;;;;13329:1;13322:9;13293:169;;;-1:-1:-1;13479:3:1;;12856:632;-1:-1:-1;;;;;;12856:632:1:o;13493:388::-;13561:6;13569;13622:2;13610:9;13601:7;13597:23;13593:32;13590:52;;;13638:1;13635;13628:12;13590:52;13677:9;13664:23;13696:31;13721:5;13696:31;:::i;:::-;13746:5;-1:-1:-1;13803:2:1;13788:18;;13775:32;13816:33;13775:32;13816:33;:::i;13886:481::-;13964:6;13972;13980;14033:2;14021:9;14012:7;14008:23;14004:32;14001:52;;;14049:1;14046;14039:12;14001:52;14072:28;14090:9;14072:28;:::i;:::-;14062:38;;14151:2;14140:9;14136:18;14123:32;-1:-1:-1;;;;;14170:6:1;14167:30;14164:50;;;14210:1;14207;14200:12;14164:50;14249:58;14299:7;14290:6;14279:9;14275:22;14249:58;:::i;:::-;13886:481;;14326:8;;-1:-1:-1;14223:84:1;;-1:-1:-1;;;;13886:481:1:o;14625:380::-;14704:1;14700:12;;;;14747;;;14768:61;;14822:4;14814:6;14810:17;14800:27;;14768:61;14875:2;14867:6;14864:14;14844:18;14841:38;14838:161;;;14921:10;14916:3;14912:20;14909:1;14902:31;14956:4;14953:1;14946:15;14984:4;14981:1;14974:15;15010:811;15136:3;15165:1;15198:6;15192:13;15228:36;15254:9;15228:36;:::i;:::-;15283:1;15300:18;;;15327:104;;;;15445:1;15440:356;;;;15293:503;;15327:104;-1:-1:-1;;15360:24:1;;15348:37;;15405:16;;;;-1:-1:-1;15327:104:1;;15440:356;15471:6;15468:1;15461:17;15501:4;15546:2;15543:1;15533:16;15571:1;15585:165;15599:6;15596:1;15593:13;15585:165;;;15677:14;;15664:11;;;15657:35;15720:16;;;;15614:10;;15585:165;;;15589:3;;;15779:6;15774:3;15770:16;15763:23;;15293:503;-1:-1:-1;15812:3:1;;15010:811;-1:-1:-1;;;;;;15010:811:1:o;16247:557::-;16504:6;16496;16492:19;16481:9;16474:38;16548:3;16543:2;16532:9;16528:18;16521:31;16455:4;16575:46;16616:3;16605:9;16601:19;16593:6;16575:46;:::i;:::-;-1:-1:-1;;;;;16661:6:1;16657:31;16652:2;16641:9;16637:18;16630:59;16737:9;16729:6;16725:22;16720:2;16709:9;16705:18;16698:50;16765:33;16791:6;16783;16765:33;:::i;:::-;16757:41;16247:557;-1:-1:-1;;;;;;;16247:557:1:o;16809:274::-;16938:3;16976:6;16970:13;16992:53;17038:6;17033:3;17026:4;17018:6;17014:17;16992:53;:::i;:::-;17061:16;;;;;16809:274;-1:-1:-1;;16809:274:1:o;18333:410::-;18535:2;18517:21;;;18574:2;18554:18;;;18547:30;18613:34;18608:2;18593:18;;18586:62;-1:-1:-1;;;18679:2:1;18664:18;;18657:44;18733:3;18718:19;;18333:410::o;18748:127::-;18809:10;18804:3;18800:20;18797:1;18790:31;18840:4;18837:1;18830:15;18864:4;18861:1;18854:15;18880:168;18920:7;18986:1;18982;18978:6;18974:14;18971:1;18968:21;18963:1;18956:9;18949:17;18945:45;18942:71;;;18993:18;;:::i;:::-;-1:-1:-1;19033:9:1;;18880:168::o;19053:127::-;19114:10;19109:3;19105:20;19102:1;19095:31;19145:4;19142:1;19135:15;19169:4;19166:1;19159:15;19185:120;19225:1;19251;19241:35;;19256:18;;:::i;:::-;-1:-1:-1;19290:9:1;;19185:120::o;20897:127::-;20958:10;20953:3;20949:20;20946:1;20939:31;20989:4;20986:1;20979:15;21013:4;21010:1;21003:15;21029:135;21068:3;-1:-1:-1;;21089:17:1;;21086:43;;;21109:18;;:::i;:::-;-1:-1:-1;21156:1:1;21145:13;;21029:135::o;21921:184::-;21991:6;22044:2;22032:9;22023:7;22019:23;22015:32;22012:52;;;22060:1;22057;22050:12;22012:52;-1:-1:-1;22083:16:1;;21921:184;-1:-1:-1;21921:184:1:o;22110:245::-;22177:6;22230:2;22218:9;22209:7;22205:23;22201:32;22198:52;;;22246:1;22243;22236:12;22198:52;22278:9;22272:16;22297:28;22319:5;22297:28;:::i;24617:128::-;24657:3;24688:1;24684:6;24681:1;24678:13;24675:39;;;24694:18;;:::i;:::-;-1:-1:-1;24730:9:1;;24617:128::o;25456:125::-;25496:4;25524:1;25521;25518:8;25515:34;;;25529:18;;:::i;:::-;-1:-1:-1;25566:9:1;;25456:125::o;27525:642::-;27806:6;27794:19;;27776:38;;-1:-1:-1;;;;;27850:32:1;;27845:2;27830:18;;27823:60;27870:3;27914:2;27899:18;;27892:31;;;-1:-1:-1;;27946:46:1;;27972:19;;27964:6;27946:46;:::i;:::-;28042:6;28035:14;28028:22;28023:2;28012:9;28008:18;28001:50;28100:9;28092:6;28088:22;28082:3;28071:9;28067:19;28060:51;28128:33;28154:6;28146;28128:33;:::i;:::-;28120:41;27525:642;-1:-1:-1;;;;;;;;27525:642:1:o;28172:245::-;28251:6;28259;28312:2;28300:9;28291:7;28287:23;28283:32;28280:52;;;28328:1;28325;28318:12;28280:52;-1:-1:-1;;28351:16:1;;28407:2;28392:18;;;28386:25;28351:16;;28386:25;;-1:-1:-1;28172:245:1:o;28905:1484::-;29251:6;29243;29239:19;29228:9;29221:38;29202:4;29278:2;29316:3;29311:2;29300:9;29296:18;29289:31;29340:1;29373:6;29367:13;29403:36;29429:9;29403:36;:::i;:::-;29476:6;29470:3;29459:9;29455:19;29448:35;29502:3;29524:1;29556:2;29545:9;29541:18;29573:1;29568:122;;;;29704:1;29699:354;;;;29534:519;;29568:122;-1:-1:-1;;29616:24:1;;29596:18;;;29589:52;29676:3;29661:19;;;-1:-1:-1;29568:122:1;;29699:354;29730:6;29727:1;29720:17;29778:2;29775:1;29765:16;29803:1;29817:180;29831:6;29828:1;29825:13;29817:180;;;29924:14;;29900:17;;;29896:26;;29889:50;29967:16;;;;29846:10;;29817:180;;;30021:17;;30017:26;;;-1:-1:-1;;29534:519:1;;;;;;30098:9;30093:3;30089:19;30084:2;30073:9;30069:18;30062:47;30132:30;30158:3;30150:6;30132:30;:::i;:::-;30118:44;;;30171:46;30213:2;30202:9;30198:18;30190:6;-1:-1:-1;;;;;3958:31:1;3946:44;;3892:104;30171:46;-1:-1:-1;;;;;3958:31:1;;30268:3;30253:19;;3946:44;30322:9;30314:6;30310:22;30304:3;30293:9;30289:19;30282:51;30350:33;30376:6;30368;30350:33;:::i;:::-;30342:41;28905:1484;-1:-1:-1;;;;;;;;;28905:1484:1:o;30801:271::-;30984:6;30976;30971:3;30958:33;30940:3;31010:16;;31035:13;;;31010:16;30801:271;-1:-1:-1;30801:271:1:o;31432:718::-;31699:6;31691;31687:19;31676:9;31669:38;31743:3;31738:2;31727:9;31723:18;31716:31;31650:4;31770:46;31811:3;31800:9;31796:19;31788:6;31770:46;:::i;:::-;-1:-1:-1;;;;;31856:6:1;31852:31;31847:2;31836:9;31832:18;31825:59;31932:9;31924:6;31920:22;31915:2;31904:9;31900:18;31893:50;31967:6;31959;31952:22;32021:6;32013;32008:2;32000:6;31996:15;31983:45;32074:1;32069:2;32060:6;32052;32048:19;32044:28;32037:39;32141:2;32134;32130:7;32125:2;32117:6;32113:15;32109:29;32101:6;32097:42;32093:51;32085:59;;;31432:718;;;;;;;;:::o;32155:175::-;32192:3;32236:4;32229:5;32225:16;32265:4;32256:7;32253:17;32250:43;;;32273:18;;:::i;:::-;32322:1;32309:15;;32155:175;-1:-1:-1;;32155:175:1:o;33103:320::-;33190:6;33198;33251:2;33239:9;33230:7;33226:23;33222:32;33219:52;;;33267:1;33264;33257:12;33219:52;33299:9;33293:16;33318:31;33343:5;33318:31;:::i;:::-;33413:2;33398:18;;;;33392:25;33368:5;;33392:25;;-1:-1:-1;;;33103:320:1:o;35353:414::-;35555:2;35537:21;;;35594:2;35574:18;;;35567:30;35633:34;35628:2;35613:18;;35606:62;-1:-1:-1;;;35699:2:1;35684:18;;35677:48;35757:3;35742:19;;35353:414::o;35772:470::-;35951:3;35989:6;35983:13;36005:53;36051:6;36046:3;36039:4;36031:6;36027:17;36005:53;:::i;:::-;36121:13;;36080:16;;;;36143:57;36121:13;36080:16;36177:4;36165:17;;36143:57;:::i;:::-;36216:20;;35772:470;-1:-1:-1;;;;35772:470:1:o;36247:112::-;36279:1;36305;36295:35;;36310:18;;:::i;:::-;-1:-1:-1;36344:9:1;;36247:112::o;36713:489::-;-1:-1:-1;;;;;36982:15:1;;;36964:34;;37034:15;;37029:2;37014:18;;37007:43;37081:2;37066:18;;37059:34;;;37129:3;37124:2;37109:18;;37102:31;;;36907:4;;37150:46;;37176:19;;37168:6;37150:46;:::i;:::-;37142:54;36713:489;-1:-1:-1;;;;;;36713:489:1:o;37207:249::-;37276:6;37329:2;37317:9;37308:7;37304:23;37300:32;37297:52;;;37345:1;37342;37335:12;37297:52;37377:9;37371:16;37396:30;37420:5;37396:30;:::i;38431:127::-;38492:10;38487:3;38483:20;38480:1;38473:31;38523:4;38520:1;38513:15;38547:4;38544:1;38537:15
Swarm Source
ipfs://166ca3973ee7e5739f38ee4d84c19ed9c885d8b7699f691b35ae93af7daf1e3b