ERC-721
Source Code
Overview
Max Total Supply
0 CPT
Holders
0
Transfers
-
0
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
Collection
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-03-15
*/
/**
*Submitted for verification at Etherscan.io on 2023-02-23
*/
// File: contracts\CollectionProxy\ProxyBaseStorage.sol
pragma solidity ^0.8.0;
///////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @title ProxyBaseStorage
* @dev Defining base storage for the proxy contract.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
contract ProxyBaseStorage {
//////////////////////////////////////////// VARS /////////////////////////////////////////////
// maps functions to the delegate contracts that execute the functions.
// funcId => delegate contract
mapping(bytes4 => address) public delegates;
// array of function signatures supported by the contract.
bytes[] public funcSignatures;
// maps each function signature to its position in the funcSignatures array.
// signature => index+1
mapping(bytes => uint256) internal funcSignatureToIndex;
// proxy address of itself, can be used for cross-delegate calls but also safety checking.
address proxy;
///////////////////////////////////////////////////////////////////////////////////////////////
}
// 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\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\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\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\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\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\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\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\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) internal _owners;
// Mapping owner address to token count
mapping(address => uint256) internal _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: contracts\OpenseaStandard\IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
/**
* @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
* true if supplied registrant address is not registered.
*/
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
/**
* @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
*/
function register(address registrant) external;
/**
* @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
*/
function registerAndSubscribe(address registrant, address subscription) external;
/**
* @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
* address without subscribing.
*/
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
/**
* @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
* Note that this does not remove any filtered addresses or codeHashes.
* Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
*/
function unregister(address addr) external;
/**
* @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
*/
function updateOperator(address registrant, address operator, bool filtered) external;
/**
* @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
*/
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
/**
* @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
*/
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
/**
* @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
*/
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
/**
* @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
* subscription if present.
* Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
* subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
* used.
*/
function subscribe(address registrant, address registrantToSubscribe) external;
/**
* @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
*/
function unsubscribe(address registrant, bool copyExistingEntries) external;
/**
* @notice Get the subscription address of a given registrant, if any.
*/
function subscriptionOf(address addr) external returns (address registrant);
/**
* @notice Get the set of addresses subscribed to a given registrant.
* Note that order is not guaranteed as updates are made.
*/
function subscribers(address registrant) external returns (address[] memory);
/**
* @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
* Note that order is not guaranteed as updates are made.
*/
function subscriberAt(address registrant, uint256 index) external returns (address);
/**
* @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
*/
function copyEntriesOf(address registrant, address registrantToCopy) external;
/**
* @notice Returns true if operator is filtered by a given address or its subscription.
*/
function isOperatorFiltered(address registrant, address operator) external returns (bool);
/**
* @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
*/
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
/**
* @notice Returns true if a codeHash is filtered by a given address or its subscription.
*/
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
/**
* @notice Returns a list of filtered operators for a given address or its subscription.
*/
function filteredOperators(address addr) external returns (address[] memory);
/**
* @notice Returns the set of filtered codeHashes for a given address or its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
/**
* @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
* its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
/**
* @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
* its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
/**
* @notice Returns true if an address has registered
*/
function isRegistered(address addr) external returns (bool);
/**
* @dev Convenience method to compute the code hash of an arbitrary contract
*/
function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts\OpenseaStandard\lib\Constants.sol
pragma solidity ^0.8.13;
address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// File: contracts\OpenseaStandard\OperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
* @dev This smart contract is meant to be inherited by token contracts so they can use the following:
* - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
* - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
* Please note that if your token contract does not provide an owner with EIP-173, it must provide
* administration methods on the contract itself to interact with the registry otherwise the subscription
* will be locked to the options set during construction.
*/
abstract contract OperatorFilterer {
/// @dev Emitted when an operator is not allowed.
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);
/// @dev The constructor that is called when the contract is being deployed.
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
/**
* @dev A helper function to check if an operator is allowed.
*/
modifier onlyAllowedOperator(address from) virtual {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
/**
* @dev A helper function to check if an operator approval is allowed.
*/
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
/**
* @dev A helper function to check if an operator is allowed.
*/
function _checkFilterOperator(address operator) internal view virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
// under normal circumstances, this function will revert rather than return false, but inheriting contracts
// may specify their own OperatorFilterRegistry implementations, which may behave differently
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}
// File: contracts\OpenseaStandard\DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
* @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide
* administration methods on the contract itself to interact with the registry otherwise the subscription
* will be locked to the options set during construction.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
/// @dev The constructor that is called when the contract is being deployed.
constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}
// File: contracts\NFTLimit.sol
pragma solidity ^0.8.13;
abstract contract NFTLimit is ERC721, DefaultOperatorFilterer {
mapping(address => bool) public isTransferAllowed;
mapping(uint256 => bool) public nftLock;
modifier onlyTransferAllowed(address from) {
require(isTransferAllowed[from],"ERC721: transfer not allowed");
_;
}
modifier isNFTLock(uint256 tokenId) {
require(!nftLock[tokenId],"ERC721: NFT is locked");
_;
}
function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
require(isTransferAllowed[operator],"ERC721: transfer not allowed");
super.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
require(isTransferAllowed[operator],"ERC721: transfer not allowed");
super.approve(operator, tokenId);
}
// OpenSea Enforcer functions
function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
require(!nftLock[tokenId],"ERC721: NFT is locked");
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
require(!nftLock[tokenId],"ERC721: NFT is locked");
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) {
require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
require(!nftLock[tokenId],"ERC721: NFT is locked");
super.safeTransferFrom(from, to, tokenId, data);
}
}
// File: contracts\CollectionProxy\CollectionStorage.sol
pragma solidity ^0.8.13;
contract CollectionStorage {
uint256 tokenIds;
uint256 burnCount;
string public baseURI;
mapping(address => bool) public _allowAddress;
mapping(uint256 => bytes32) internal whiteListRoot;
uint256 internal MaxSupply;
uint256 public status;
uint256 internal mainPrice;
address internal seller;
uint256 internal royalty;
uint256 public bundleId;
uint256 public perPurchaseNFTToMint;
uint256[] rarity;
struct SaleDetail {
uint256 startTime;
uint256 endTime;
uint256 price;
}
mapping (uint256=>SaleDetail) internal _saleDetails;
mapping(address => mapping(uint256 => uint256)) internal userBought;
mapping(uint256 => bool) internal isReserveWhitelist;
mapping(uint256 => uint256) public reservedNFT;
address internal gasCollector;
}
// File: contracts\CollectionProxy\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() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) internal {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// 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: contracts\MerkleProof.sol
pragma solidity ^0.8.13;
library MerkleProof {
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = _efficientHash(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: contracts\Collection.sol
pragma solidity ^0.8.13;
/**
> Collection
@notice this contract is standard ERC721 to used as xanalia user's collection managing his NFTs
*/
contract Collection is ProxyBaseStorage, NFTLimit, Ownable, CollectionStorage{
using Strings for uint256;
using SafeMath for uint256;
using Address for address;
using Strings for address;
constructor() ERC721("CryptoTest", "CPT") {
_setOwner(msg.sender);
_allowAddress[msg.sender] = true;
setAuthor(msg.sender);
setTransferAllowed(msg.sender, true);
setStartingIndex();
baseURI = "https://testapi.xanalia.com/xanalia/get-nft-meta?tokenId=";
}
modifier isValid() {
require(_allowAddress[msg.sender], "not authorize");
_;
}
function totalSupply() public view returns(uint256){
return tokenIds - burnCount - 1;
}
function getUserBoughtCount( address _add, uint256 whitelistType) public view returns(uint256) {
return userBought[_add][whitelistType];
}
function isWhitelisted(address account, bytes32[] calldata proof, uint256 quantity, uint256 whiteListType) public view returns (bool) {
return _verify(_leaf(account, quantity), proof, whiteListRoot[whiteListType]);
}
function _leaf(address account, uint256 quantity) public pure returns (bytes32) {
return keccak256(abi.encode(account, quantity));
}
function _verify(bytes32 leaf,bytes32[] memory proof,bytes32 root) internal pure returns (bool) {
return MerkleProof.verify(proof, root, leaf);
}
/**
@notice function resposible of minting new NFTs of the collection.
@param to_ address of account to whom newely created NFT's ownership to be passed
@param countNFTs_ URI of newely created NFT
Note only owner can mint NFT
*/
function preMint(address to_, uint256 countNFTs_) isValid() public {
require(MaxSupply >= totalSupply()+ countNFTs_, "exceeding supply");
unchecked{
uint256 start = tokenIds;
for (tokenIds; tokenIds < start + countNFTs_; tokenIds++) {
_mint(to_, tokenIds);
}
emit Mint(start, tokenIds - 1, countNFTs_, to_);
}
}
function setStartingIndex() isValid public {
require(tokenIds == 0, "already set");
tokenIds = 1;
}
function mint(bytes32[] calldata proof, uint256 limit, uint256 whiteListType) external {
require(msg.sender == tx.origin, "101");
require(_saleDetails[whiteListType].startTime <= block.timestamp, "sale not started yet");
require(_saleDetails[whiteListType].endTime > block.timestamp, "sale has ended");
uint256 quantity = userBought[msg.sender][whiteListType] + limit;
require(isWhitelisted(msg.sender, proof, quantity,whiteListType), "not authorize");
require(MaxSupply >= totalSupply().add(limit), "soldout");
uint256 from = tokenIds;
for (uint256 index = from; index < from + limit; index++) {
_safeMint(msg.sender, tokenIds);
nftLock[tokenIds] = whiteListType == 1;
tokenIds++;
}
uint256 to = tokenIds - 1;
userBought[msg.sender][whiteListType] =userBought[msg.sender][whiteListType]+ limit ;
emit MintNFT(from, to, whiteListType == 1, msg.sender);
}
function unLockGas(uint256[] memory tokenIds, uint256 dbId) payable external {
uint256 depositAmount = msg.value;
require(tokenIds.length <= 5, "not more than 5 token ids");
(bool success,) = payable(gasCollector).call{value: depositAmount}("");
if(!success) revert("unable to receive eth");
emit UnLockGasPaid(tokenIds,msg.sender,depositAmount, dbId);
}
function lockGas(uint256[] memory tokenIds, uint256 dbId) payable external {
uint256 depositAmount = msg.value;
require(tokenIds.length <= 5, "not more than 5 token ids");
(bool success,) = payable(gasCollector).call{value: depositAmount}("");
if(!success) revert("unable to receive eth");
emit LockGasPaid(tokenIds,msg.sender,depositAmount, dbId);
}
function setGasCollector(address _add) onlyOwner external {
gasCollector = _add;
}
function burnAdmin(uint256 tokenId) isValid() public {
burnCount++;
_burn(tokenId);
emit Burn(tokenId);
}
function adminTransfer(address to, uint256 tokenId) isValid() public {
address owner = ownerOf(tokenId);
if(nftLock[tokenId]){
nftLock[tokenId] = false;
_transfer(owner, to, tokenId);
nftLock[tokenId] = true;
}else {
_transfer(owner, to, tokenId);
}
}
function addAllowAddress(address _add) onlyOwner() public {
_allowAddress[_add] = true;
isTransferAllowed[_add] = true;
}
function removeAllowAddress(address _add) onlyOwner() public {
_allowAddress[_add] = false;
isTransferAllowed[_add] = false;
}
function setWhitelistRoot(bytes32 _root, uint256 whitelistType, bool isReserve) onlyOwner() public {
whiteListRoot[whitelistType] = _root;
isReserveWhitelist[whitelistType] = isReserve;
}
function setPerBundleNFTToMint( uint256 nftTomint) onlyOwner external {
perPurchaseNFTToMint = nftTomint;
}
function setAuthor(address _add) onlyOwner() public {
seller= _add;
}
function setMaxSupply(uint256 supply) onlyOwner() public {
MaxSupply= supply;
}
function setTransferAllowed(address _add, bool status) onlyOwner public {
require(isTransferAllowed[_add] != status, "Xanaland: status already set");
isTransferAllowed[_add] = status;
}
function setStatus(uint256 _status) onlyOwner public {
status= _status;
}
function setSaleDetails(uint256 _startTime, uint256 _endTime, uint256 whitelistType) onlyOwner public {
_saleDetails[whitelistType] = SaleDetail(_startTime, _endTime, 0);
}
function getSaleDetails( uint256 whitelistType) public view returns(uint256 _startTime, uint256 _endTime) {
_startTime = _saleDetails[whitelistType].startTime;
_endTime = _saleDetails[whitelistType].endTime;
}
function setPrice(uint256 price) onlyOwner public {
mainPrice = price;
}
function getPrice() public view returns(uint256) {
return mainPrice;
}
function getMaxSupply() public view returns(uint256) {
return MaxSupply;
}
function getRootHash(uint256 whitelisType) public view returns(bytes32){
return whiteListRoot[whitelisType];
}
function getLockAed(uint256 tokenId) public view returns(bool) {
return nftLock[tokenId];
}
function getIsTransferAllowed(address operator) public view returns(bool) {
return isTransferAllowed[operator];
}
function setlockStatusNFT(uint256 tokenId, bool status) isValid external {
require(nftLock[tokenId] != status, "status already set");
nftLock[tokenId] = status;
}
function lockNFTBulk(uint256[] memory tokenIds, bool status) isValid external {
for (uint256 index = 0; index < tokenIds.length; index++) {
nftLock[tokenIds[index]] = status;
}
emit NFTLockStatus(tokenIds, status);
}
function setRoyalty(uint256 _amount) onlyOwner public {
royalty = _amount;
}
function getAuthor(uint256 tokenId) public view returns(address){
return seller;
}
function getRoyaltyFee(uint256 tokenId) public view returns(uint256){
return royalty;
}
function getCreator(uint256 tokenId) public view returns(address){
return seller;
}
function setBaseURI(string memory baseURI_) external onlyOwner {
baseURI = baseURI_;
emit BaseURI(baseURI);
}
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return baseURI;
}
fallback() payable external {}
receive() payable external {}
// events
event BaseURI(string uri);
event Burn(uint256 tokenId);
event AdminTransfer(address from, address to, uint256 indexed tokenId);
event AddRound(uint256 indexed roundId, uint256 price, address seller, uint256 perPurchaseLimit, uint256 userPurchaseLimit, bool isPublic, uint256 startTime, uint256 endTime, uint256 maxSupply );
event EditRound(uint256 indexed roundId, uint256 price, address seller, uint256 perPurchaseLimit, uint256 userPurchaseLimit, bool isPublic, uint256 startTime, uint256 endTime, uint256 maxSupply );
event PurchaseNFT(uint256 from, uint256 to, uint256 price, uint256 paid, address seller, address buyer);
event MintNFT(uint256 from, uint256 to, bool isLock, address buyer);
event ClaimNFT(uint256 from, uint256 to, address buyer);
event ReserverNFT( uint256 price, uint256 paid, address seller, address buyer, uint256 limit);
event CraftNFT(uint256 tokenId, uint256[] tokenIds, address to);
event Mint(uint256 start, uint256 end, uint256 total, address to);
event LockGasPaid(uint256[] tokenIds, address from, uint256 price, uint256 dbId);
event UnLockGasPaid(uint256[] tokenIds, address from, uint256 price, uint256 dbId);
event NFTLockStatus(uint256[] tokenIds, bool status);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"perPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isPublic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"AddRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AdminTransfer","type":"event"},{"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":"string","name":"uri","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"ClaimNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"CraftNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"perPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isPublic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"EditRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dbId","type":"uint256"}],"name":"LockGasPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLock","type":"bool"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"MintNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"NFTLockStatus","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":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"PurchaseNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"ReserverNFT","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dbId","type":"uint256"}],"name":"UnLockGasPaid","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_allowAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"_leaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"addAllowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bundleId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"funcSignatures","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"getIsTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLockAed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelisType","type":"uint256"}],"name":"getRootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"getSaleDetails","outputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"getUserBoughtCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"whiteListType","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"dbId","type":"uint256"}],"name":"lockGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"lockNFTBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"whiteListType","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perPurchaseNFTToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"countNFTs_","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"removeAllowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reservedNFT","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":"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":"address","name":"_add","type":"address"}],"name":"setAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"setGasCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftTomint","type":"uint256"}],"name":"setPerBundleNFTToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"setSaleDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setTransferAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"uint256","name":"whitelistType","type":"uint256"},{"internalType":"bool","name":"isReserve","type":"bool"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setlockStatusNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"dbId","type":"uint256"}],"name":"unLockGas","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020016910dc9e5c1d1bd5195cdd60b21b8152506040518060400160405280600381526020016210d41560ea1b81525081600490816200007991906200053d565b5060056200008882826200053d565b5050506daaeb6d7670e522a718067333cd4e3b15620001d05780156200011e57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000ff57600080fd5b505af115801562000114573d6000803e3d6000fd5b50505050620001d0565b6001600160a01b038216156200016f5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e4565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001b657600080fd5b505af1158015620001cb573d6000803e3d6000fd5b505050505b50620001de90503362000255565b620001e93362000255565b336000818152601060205260409020805460ff191660011790556200020e90620002a7565b6200021b33600162000318565b6200022562000400565b60405180606001604052806039815260200162003b4560399139600f906200024e90826200053d565b5062000609565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c546001600160a01b03163314620002f65760405162461bcd60e51b8152602060048201819052602482015260008051602062003b7e83398151915260448201526064015b60405180910390fd5b601580546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314620003635760405162461bcd60e51b8152602060048201819052602482015260008051602062003b7e8339815191526044820152606401620002ed565b6001600160a01b0382166000908152600a602052604090205481151560ff909116151503620003d55760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401620002ed565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b3360009081526010602052604090205460ff16620004515760405162461bcd60e51b815260206004820152600d60248201526c6e6f7420617574686f72697a6560981b6044820152606401620002ed565b600d5415620004915760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401620002ed565b6001600d55565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004c357607f821691505b602082108103620004e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053857600081815260208120601f850160051c81016020861015620005135750805b601f850160051c820191505b8181101562000534578281556001016200051f565b5050505b505050565b81516001600160401b0381111562000559576200055962000498565b62000571816200056a8454620004ae565b84620004ea565b602080601f831160018114620005a95760008415620005905750858301515b600019600386901b1c1916600185901b17855562000534565b600085815260208120601f198616915b82811015620005da57888601518255948401946001909101908401620005b9565b5085821015620005f95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61352c80620006196000396000f3fe6080604052600436106103815760003560e01c80636f8b44b0116101cf578063a22cb46511610101578063cbc281161161009a578063e98665501161006c578063e986655014610b6c578063f17e48ec14610b81578063f2fde38b14610ba1578063f4e37f1214610bc157005b8063cbc2811614610af0578063d48e638a14610957578063e02f8e1f14610b03578063e985e9c514610b2357005b8063b61d0c63116100d3578063b61d0c6314610a70578063b88d4fde14610a90578063bc8d4cd614610ab0578063c87b56dd14610ad057005b8063a22cb465146109fa578063a8b8042814610a1a578063aa8062ef14610a3a578063b481630d14610a5057005b80638da5cb5b116101735780639e2b8488116101455780639e2b8488146109575780639e4c014114610982578063a05f41a4146109a4578063a0a2daf0146109c457005b80638da5cb5b146108ef57806391b7f5ed1461090d57806395d89b411461092d57806398d5fdca1461094257005b806374f32b3e116101ac57806374f32b3e146108355780637be95c85146108555780638822048e146108755780638c746d8b146108a557005b80636f8b44b0146107e057806370a0823114610800578063715018a61461082057005b80632e8adc21116102b3578063521b52a41161024c57806369ba1a751161021e57806369ba1a751461076b57806369ff1a811461078b5780636c0360eb146107ab5780636f27cf64146107c057005b8063521b52a4146106b857806355f804b3146106e857806357a9d3bc146107085780636352211e1461074b57005b806342842e0e1161028557806342842e0e14610623578063495d8151146106435780634c0f38c2146106735780635124ce221461068857005b80632e8adc21146105ae57806331a365de146105c157806341f43434146105e15780634209a2e11461060357005b8063126fe62d1161032557806323922f86116102f757806323922f861461052e57806323b872dd1461054e57806326a6860a1461056e578063290c292d1461058e57005b8063126fe62d146104c357806314bf9af6146104e357806318160ddd14610503578063200d2ed21461051857005b8063081812fc1161035e578063081812fc1461041a578063093abc8614610452578063095ea7b31461048d5780630994b1ad146104ad57005b806301ffc9a71461038a578063057c2c6a146103bf57806306fdde03146103f857005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004612ab2565b610bee565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b506103aa6103da366004612aeb565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561040457600080fd5b5061040d610c40565b6040516103b69190612b4c565b34801561042657600080fd5b5061043a610435366004612b5f565b610cd2565b6040516001600160a01b0390911681526020016103b6565b34801561045e57600080fd5b5061047f61046d366004612b5f565b60009081526011602052604090205490565b6040519081526020016103b6565b34801561049957600080fd5b506103886104a8366004612b78565b610cf9565b3480156104b957600080fd5b5061047f60185481565b3480156104cf57600080fd5b506103886104de366004612aeb565b610d53565b3480156104ef57600080fd5b506103886104fe366004612bee565b610db3565b34801561050f57600080fd5b5061047f61103a565b34801561052457600080fd5b5061047f60135481565b34801561053a57600080fd5b50610388610549366004612c4d565b61105d565b34801561055a57600080fd5b50610388610569366004612c7d565b611107565b34801561057a57600080fd5b5061040d610589366004612b5f565b611190565b34801561059a57600080fd5b506103886105a9366004612b78565b61123c565b6103886105bc366004612d80565b611347565b3480156105cd57600080fd5b506103886105dc366004612dc5565b611474565b3480156105ed57600080fd5b5061043a6daaeb6d7670e522a718067333cd4e81565b34801561060f57600080fd5b5061038861061e366004612b5f565b6114cb565b34801561062f57600080fd5b5061038861063e366004612c7d565b6114fa565b34801561064f57600080fd5b506103aa61065e366004612b5f565b600b6020526000908152604090205460ff1681565b34801561067f57600080fd5b5060125461047f565b34801561069457600080fd5b506103aa6106a3366004612b5f565b6000908152600b602052604090205460ff1690565b3480156106c457600080fd5b506103aa6106d3366004612aeb565b60106020526000908152604090205460ff1681565b3480156106f457600080fd5b50610388610703366004612e56565b61157d565b34801561071457600080fd5b5061047f610723366004612b78565b6001600160a01b03919091166000908152601b60209081526040808320938352929052205490565b34801561075757600080fd5b5061043a610766366004612b5f565b6115ef565b34801561077757600080fd5b50610388610786366004612b5f565b61164f565b34801561079757600080fd5b506103886107a6366004612aeb565b61167e565b3480156107b757600080fd5b5061040d6116e4565b3480156107cc57600080fd5b506103886107db366004612aeb565b6116f1565b3480156107ec57600080fd5b506103886107fb366004612b5f565b61173d565b34801561080c57600080fd5b5061047f61081b366004612aeb565b61176c565b34801561082c57600080fd5b506103886117f2565b34801561084157600080fd5b506103aa610850366004612e9f565b611828565b34801561086157600080fd5b50610388610870366004612b5f565b611887565b34801561088157600080fd5b506103aa610890366004612aeb565b600a6020526000908152604090205460ff1681565b3480156108b157600080fd5b506108da6108c0366004612b5f565b6000908152601a6020526040902080546001909101549091565b604080519283526020830191909152016103b6565b3480156108fb57600080fd5b50600c546001600160a01b031661043a565b34801561091957600080fd5b50610388610928366004612b5f565b6118b6565b34801561093957600080fd5b5061040d6118e5565b34801561094e57600080fd5b5060145461047f565b34801561096357600080fd5b5061043a610972366004612b5f565b506015546001600160a01b031690565b34801561098e57600080fd5b5061047f61099d366004612b5f565b5060165490565b3480156109b057600080fd5b506103886109bf366004612aeb565b6118f4565b3480156109d057600080fd5b5061043a6109df366004612ab2565b6000602081905290815260409020546001600160a01b031681565b348015610a0657600080fd5b50610388610a15366004612f04565b611940565b348015610a2657600080fd5b50610388610a35366004612f04565b61198c565b348015610a4657600080fd5b5061047f60175481565b348015610a5c57600080fd5b50610388610a6b366004612f30565b611a51565b348015610a7c57600080fd5b5061047f610a8b366004612b78565b611ab5565b348015610a9c57600080fd5b50610388610aab366004612f5c565b611af2565b348015610abc57600080fd5b50610388610acb366004612fd8565b611b7d565b348015610adc57600080fd5b5061040d610aeb366004612b5f565b611c4d565b610388610afe366004612d80565b611cdd565b348015610b0f57600080fd5b50610388610b1e366004612b5f565b611dfd565b348015610b2f57600080fd5b506103aa610b3e36600461301f565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b348015610b7857600080fd5b50610388611e7a565b348015610b8d57600080fd5b50610388610b9c366004612b78565b611eee565b348015610bad57600080fd5b50610388610bbc366004612aeb565b611f8c565b348015610bcd57600080fd5b5061047f610bdc366004612b5f565b601d6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480610c1f57506001600160e01b03198216635b5e139f60e01b145b80610c3a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610c4f90613052565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7b90613052565b8015610cc85780601f10610c9d57610100808354040283529160200191610cc8565b820191906000526020600020905b815481529060010190602001808311610cab57829003601f168201915b5050505050905090565b6000610cdd82612027565b506000908152600860205260409020546001600160a01b031690565b81610d0381612086565b6001600160a01b0383166000908152600a602052604090205460ff16610d445760405162461bcd60e51b8152600401610d3b9061308c565b60405180910390fd5b610d4e838361213f565b505050565b600c546001600160a01b03163314610d7d5760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b03166000908152601060209081526040808320805460ff19908116909155600a90925290912080549091169055565b333214610de85760405162461bcd60e51b815260206004820152600360248201526231303160e81b6044820152606401610d3b565b6000818152601a6020526040902054421015610e3d5760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081cdd185c9d1959081e595d60621b6044820152606401610d3b565b6000818152601a60205260409020600101544210610e8e5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481a185cc8195b99195960921b6044820152606401610d3b565b336000908152601b60209081526040808320848452909152812054610eb490849061310e565b9050610ec33386868486611828565b610edf5760405162461bcd60e51b8152600401610d3b90613121565b610ef183610eeb61103a565b9061224f565b6012541015610f2c5760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d3b565b600d54805b610f3b858361310e565b811015610f9257610f4e33600d5461225b565b600d80546000908152600b60205260408120805460ff19166001881417905581549190610f7a83613148565b91905055508080610f8a90613148565b915050610f31565b5060006001600d54610fa49190613161565b336000908152601b60209081526040808320888452909152902054909150610fcd90869061310e565b336000818152601b60209081526040808320898452825291829020939093558051858152928301849052600187149083015260608201527fb6502a18f7b13e30f9a0efb62bfb56933b3a3104595a3cdf219b0227f271ecdc9060800160405180910390a150505050505050565b60006001600e54600d5461104e9190613161565b6110589190613161565b905090565b3360009081526010602052604090205460ff1661108c5760405162461bcd60e51b8152600401610d3b90613121565b6000828152600b602052604090205481151560ff9091161515036110e75760405162461bcd60e51b81526020600482015260126024820152711cdd185d1d5cc8185b1c9958591e481cd95d60721b6044820152606401610d3b565b6000918252600b6020526040909120805460ff1916911515919091179055565b826001600160a01b03811633146111215761112133612086565b336000908152600a602052604090205460ff166111505760405162461bcd60e51b8152600401610d3b9061308c565b6000828152600b602052604090205460ff161561117f5760405162461bcd60e51b8152600401610d3b90613174565b61118a848484612279565b50505050565b600181815481106111a057600080fd5b9060005260206000200160009150905080546111bb90613052565b80601f01602080910402602001604051908101604052809291908181526020018280546111e790613052565b80156112345780601f1061120957610100808354040283529160200191611234565b820191906000526020600020905b81548152906001019060200180831161121757829003601f168201915b505050505081565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b8152600401610d3b90613121565b8061127461103a565b61127e919061310e565b60125410156112c25760405162461bcd60e51b815260206004820152601060248201526f657863656564696e6720737570706c7960801b6044820152606401610d3b565b600d545b818101600d5410156112ec576112de83600d546122aa565b600d805460010190556112c6565b600d5460408051838152600019909201602083015281018390526001600160a01b03841660608201527faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e5169060800160405180910390a1505050565b81513490600510156113975760405162461bcd60e51b81526020600482015260196024820152786e6f74206d6f7265207468616e203520746f6b656e2069647360381b6044820152606401610d3b565b601e546040516000916001600160a01b03169083908381818185875af1925050503d80600081146113e4576040519150601f19603f3d011682016040523d82523d6000602084013e6113e9565b606091505b50509050806114325760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d3b565b7ecdb41d94af2c216b4786938844cfdc35283f2aefae511d22a041792d78abe18433848660405161146694939291906131de565b60405180910390a150505050565b600c546001600160a01b0316331461149e5760405162461bcd60e51b8152600401610d3b906130c3565b600091825260116020908152604080842094909455601c9052919020805460ff1916911515919091179055565b600c546001600160a01b031633146114f55760405162461bcd60e51b8152600401610d3b906130c3565b601655565b826001600160a01b03811633146115145761151433612086565b336000908152600a602052604090205460ff166115435760405162461bcd60e51b8152600401610d3b9061308c565b6000828152600b602052604090205460ff16156115725760405162461bcd60e51b8152600401610d3b90613174565b61118a8484846123ec565b600c546001600160a01b031633146115a75760405162461bcd60e51b8152600401610d3b906130c3565b600f6115b38282613264565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72600f6040516115e49190613324565b60405180910390a150565b6000818152600660205260408120546001600160a01b031680610c3a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d3b565b600c546001600160a01b031633146116795760405162461bcd60e51b8152600401610d3b906130c3565b601355565b600c546001600160a01b031633146116a85760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b031660009081526010602090815260408083208054600160ff199182168117909255600a909352922080549091169091179055565b600f80546111bb90613052565b600c546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610d3b906130c3565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b031633146117675760405162461bcd60e51b8152600401610d3b906130c3565b601255565b60006001600160a01b0382166117d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d3b565b506001600160a01b031660009081526007602052604090205490565b600c546001600160a01b0316331461181c5760405162461bcd60e51b8152600401610d3b906130c3565b6118266000612407565b565b600061187d6118378785611ab5565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152601160205260409020549250612459915050565b9695505050505050565b600c546001600160a01b031633146118b15760405162461bcd60e51b8152600401610d3b906130c3565b601855565b600c546001600160a01b031633146118e05760405162461bcd60e51b8152600401610d3b906130c3565b601455565b606060058054610c4f90613052565b600c546001600160a01b0316331461191e5760405162461bcd60e51b8152600401610d3b906130c3565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b8161194a81612086565b6001600160a01b0383166000908152600a602052604090205460ff166119825760405162461bcd60e51b8152600401610d3b9061308c565b610d4e838361246e565b600c546001600160a01b031633146119b65760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b0382166000908152600a602052604090205481151560ff909116151503611a265760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610d3b565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600c546001600160a01b03163314611a7b5760405162461bcd60e51b8152600401610d3b906130c3565b6040805160608101825293845260208085019384526000858301818152938152601a90915220925183559051600183015551600290910155565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b836001600160a01b0381163314611b0c57611b0c33612086565b336000908152600a602052604090205460ff16611b3b5760405162461bcd60e51b8152600401610d3b9061308c565b6000838152600b602052604090205460ff1615611b6a5760405162461bcd60e51b8152600401610d3b90613174565b611b7685858585612479565b5050505050565b3360009081526010602052604090205460ff16611bac5760405162461bcd60e51b8152600401610d3b90613121565b60005b8251811015611c0f5781600b6000858481518110611bcf57611bcf6133af565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c0790613148565b915050611baf565b507fc55a0de0f0b6c1b85d9c52787d91c8068c5a331e926fb9e3c575b435e97fe14f8282604051611c419291906133c5565b60405180910390a15050565b6000818152600660205260409020546060906001600160a01b0316611ccc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d3b565b6000611cd66124ab565b9392505050565b8151349060051015611d2d5760405162461bcd60e51b81526020600482015260196024820152786e6f74206d6f7265207468616e203520746f6b656e2069647360381b6044820152606401610d3b565b601e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611d7a576040519150601f19603f3d011682016040523d82523d6000602084013e611d7f565b606091505b5050905080611dc85760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d3b565b7f9d3fc7c6858672d62378c66aabf170a70b98ed6283ed4d2367fa23ae47c6cff88433848660405161146694939291906131de565b3360009081526010602052604090205460ff16611e2c5760405162461bcd60e51b8152600401610d3b90613121565b600e8054906000611e3c83613148565b9190505550611e4a816124ba565b6040518181527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb906020016115e4565b3360009081526010602052604090205460ff16611ea95760405162461bcd60e51b8152600401610d3b90613121565b600d5415611ee75760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610d3b565b6001600d55565b3360009081526010602052604090205460ff16611f1d5760405162461bcd60e51b8152600401610d3b90613121565b6000611f28826115ef565b6000838152600b602052604090205490915060ff1615611f81576000828152600b60205260409020805460ff19169055611f63818484612555565b6000828152600b60205260409020805460ff19166001179055505050565b610d4e818484612555565b600c546001600160a01b03163314611fb65760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b03811661201b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3b565b61202481612407565b50565b6000818152600660205260409020546001600160a01b03166120245760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d3b565b6daaeb6d7670e522a718067333cd4e3b1561202457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211791906133e9565b61202457604051633b79c77360e21b81526001600160a01b0382166004820152602401610d3b565b600061214a826115ef565b9050806001600160a01b0316836001600160a01b0316036121b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d3b565b336001600160a01b03821614806121d357506121d38133610b3e565b6122455760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d3b565b610d4e83836126f1565b6000611cd6828461310e565b61227582826040518060200160405280600081525061275f565b5050565b6122833382612792565b61229f5760405162461bcd60e51b8152600401610d3b90613406565b610d4e838383612555565b6001600160a01b0382166123005760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d3b565b6000818152600660205260409020546001600160a01b0316156123655760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d3b565b6001600160a01b038216600090815260076020526040812080546001929061238e90849061310e565b909155505060008181526006602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610d4e83838360405180602001604052806000815250611af2565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612466838386612810565b949350505050565b612275338383612826565b6124833383612792565b61249f5760405162461bcd60e51b8152600401610d3b90613406565b61118a848484846128f4565b6060600f8054610c4f90613052565b60006124c5826115ef565b90506124d26000836126f1565b6001600160a01b03811660009081526007602052604081208054600192906124fb908490613161565b909155505060008281526006602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b826001600160a01b0316612568826115ef565b6001600160a01b0316146125cc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d3b565b6001600160a01b03821661262e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3b565b6126396000826126f1565b6001600160a01b0383166000908152600760205260408120805460019290612662908490613161565b90915550506001600160a01b038216600090815260076020526040812080546001929061269090849061310e565b909155505060008181526006602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260086020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612726826115ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61276983836122aa565b6127766000848484612927565b610d4e5760405162461bcd60e51b8152600401610d3b90613454565b60008061279e836115ef565b9050806001600160a01b0316846001600160a01b031614806127e557506001600160a01b0380821660009081526009602090815260408083209388168352929052205460ff165b806124665750836001600160a01b03166127fe84610cd2565b6001600160a01b031614949350505050565b60008261281d8584612a28565b14949350505050565b816001600160a01b0316836001600160a01b0316036128875760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d3b565b6001600160a01b03838116600081815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128ff848484612555565b61290b84848484612927565b61118a5760405162461bcd60e51b8152600401610d3b90613454565b60006001600160a01b0384163b15612a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061296b9033908990889088906004016134a6565b6020604051808303816000875af19250505080156129a6575060408051601f3d908101601f191682019092526129a3918101906134d9565b60015b612a03573d8080156129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b5080516000036129fb5760405162461bcd60e51b8152600401610d3b90613454565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612466565b506001949350505050565b600081815b8451811015612a94576000858281518110612a4a57612a4a6133af565b60200260200101519050808311612a705760008381526020829052604090209250612a81565b600081815260208490526040902092505b5080612a8c81613148565b915050612a2d565b509392505050565b6001600160e01b03198116811461202457600080fd5b600060208284031215612ac457600080fd5b8135611cd681612a9c565b80356001600160a01b0381168114612ae657600080fd5b919050565b600060208284031215612afd57600080fd5b611cd682612acf565b6000815180845260005b81811015612b2c57602081850181015186830182015201612b10565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611cd66020830184612b06565b600060208284031215612b7157600080fd5b5035919050565b60008060408385031215612b8b57600080fd5b612b9483612acf565b946020939093013593505050565b60008083601f840112612bb457600080fd5b50813567ffffffffffffffff811115612bcc57600080fd5b6020830191508360208260051b8501011115612be757600080fd5b9250929050565b60008060008060608587031215612c0457600080fd5b843567ffffffffffffffff811115612c1b57600080fd5b612c2787828801612ba2565b90989097506020870135966040013595509350505050565b801515811461202457600080fd5b60008060408385031215612c6057600080fd5b823591506020830135612c7281612c3f565b809150509250929050565b600080600060608486031215612c9257600080fd5b612c9b84612acf565b9250612ca960208501612acf565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cf857612cf8612cb9565b604052919050565b600082601f830112612d1157600080fd5b8135602067ffffffffffffffff821115612d2d57612d2d612cb9565b8160051b612d3c828201612ccf565b9283528481018201928281019087851115612d5657600080fd5b83870192505b84831015612d7557823582529183019190830190612d5c565b979650505050505050565b60008060408385031215612d9357600080fd5b823567ffffffffffffffff811115612daa57600080fd5b612db685828601612d00565b95602094909401359450505050565b600080600060608486031215612dda57600080fd5b83359250602084013591506040840135612df381612c3f565b809150509250925092565b600067ffffffffffffffff831115612e1857612e18612cb9565b612e2b601f8401601f1916602001612ccf565b9050828152838383011115612e3f57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612e6857600080fd5b813567ffffffffffffffff811115612e7f57600080fd5b8201601f81018413612e9057600080fd5b61246684823560208401612dfe565b600080600080600060808688031215612eb757600080fd5b612ec086612acf565b9450602086013567ffffffffffffffff811115612edc57600080fd5b612ee888828901612ba2565b9699909850959660408101359660609091013595509350505050565b60008060408385031215612f1757600080fd5b612f2083612acf565b91506020830135612c7281612c3f565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612f7257600080fd5b612f7b85612acf565b9350612f8960208601612acf565b925060408501359150606085013567ffffffffffffffff811115612fac57600080fd5b8501601f81018713612fbd57600080fd5b612fcc87823560208401612dfe565b91505092959194509250565b60008060408385031215612feb57600080fd5b823567ffffffffffffffff81111561300257600080fd5b61300e85828601612d00565b9250506020830135612c7281612c3f565b6000806040838503121561303257600080fd5b61303b83612acf565b915061304960208401612acf565b90509250929050565b600181811c9082168061306657607f821691505b60208210810361308657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c3a57610c3a6130f8565b6020808252600d908201526c6e6f7420617574686f72697a6560981b604082015260600190565b60006001820161315a5761315a6130f8565b5060010190565b81810381811115610c3a57610c3a6130f8565b602080825260159082015274115490cdcc8c4e88139195081a5cc81b1bd8dad959605a1b604082015260600190565b600081518084526020808501945080840160005b838110156131d3578151875295820195908201906001016131b7565b509495945050505050565b6080815260006131f160808301876131a3565b6001600160a01b03959095166020830152506040810192909252606090910152919050565b601f821115610d4e57600081815260208120601f850160051c8101602086101561323d5750805b601f850160051c820191505b8181101561325c57828155600101613249565b505050505050565b815167ffffffffffffffff81111561327e5761327e612cb9565b6132928161328c8454613052565b84613216565b602080601f8311600181146132c757600084156132af5750858301515b600019600386901b1c1916600185901b17855561325c565b600085815260208120601f198616915b828110156132f6578886015182559484019460019091019084016132d7565b50858210156133145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083526000845461333881613052565b808487015260406001808416600081146133595760018114613373576133a1565b60ff1985168984015283151560051b8901830195506133a1565b896000528660002060005b858110156133995781548b820186015290830190880161337e565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6040815260006133d860408301856131a3565b905082151560208301529392505050565b6000602082840312156133fb57600080fd5b8151611cd681612c3f565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061187d90830184612b06565b6000602082840312156134eb57600080fd5b8151611cd681612a9c56fea2646970667358221220177c28e12de771427009f1b4d2fc0d209f81eb67a66572fa3a217519f33906fd64736f6c6343000811003368747470733a2f2f746573746170692e78616e616c69612e636f6d2f78616e616c69612f6765742d6e66742d6d6574613f746f6b656e49643d4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106103815760003560e01c80636f8b44b0116101cf578063a22cb46511610101578063cbc281161161009a578063e98665501161006c578063e986655014610b6c578063f17e48ec14610b81578063f2fde38b14610ba1578063f4e37f1214610bc157005b8063cbc2811614610af0578063d48e638a14610957578063e02f8e1f14610b03578063e985e9c514610b2357005b8063b61d0c63116100d3578063b61d0c6314610a70578063b88d4fde14610a90578063bc8d4cd614610ab0578063c87b56dd14610ad057005b8063a22cb465146109fa578063a8b8042814610a1a578063aa8062ef14610a3a578063b481630d14610a5057005b80638da5cb5b116101735780639e2b8488116101455780639e2b8488146109575780639e4c014114610982578063a05f41a4146109a4578063a0a2daf0146109c457005b80638da5cb5b146108ef57806391b7f5ed1461090d57806395d89b411461092d57806398d5fdca1461094257005b806374f32b3e116101ac57806374f32b3e146108355780637be95c85146108555780638822048e146108755780638c746d8b146108a557005b80636f8b44b0146107e057806370a0823114610800578063715018a61461082057005b80632e8adc21116102b3578063521b52a41161024c57806369ba1a751161021e57806369ba1a751461076b57806369ff1a811461078b5780636c0360eb146107ab5780636f27cf64146107c057005b8063521b52a4146106b857806355f804b3146106e857806357a9d3bc146107085780636352211e1461074b57005b806342842e0e1161028557806342842e0e14610623578063495d8151146106435780634c0f38c2146106735780635124ce221461068857005b80632e8adc21146105ae57806331a365de146105c157806341f43434146105e15780634209a2e11461060357005b8063126fe62d1161032557806323922f86116102f757806323922f861461052e57806323b872dd1461054e57806326a6860a1461056e578063290c292d1461058e57005b8063126fe62d146104c357806314bf9af6146104e357806318160ddd14610503578063200d2ed21461051857005b8063081812fc1161035e578063081812fc1461041a578063093abc8614610452578063095ea7b31461048d5780630994b1ad146104ad57005b806301ffc9a71461038a578063057c2c6a146103bf57806306fdde03146103f857005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004612ab2565b610bee565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b506103aa6103da366004612aeb565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561040457600080fd5b5061040d610c40565b6040516103b69190612b4c565b34801561042657600080fd5b5061043a610435366004612b5f565b610cd2565b6040516001600160a01b0390911681526020016103b6565b34801561045e57600080fd5b5061047f61046d366004612b5f565b60009081526011602052604090205490565b6040519081526020016103b6565b34801561049957600080fd5b506103886104a8366004612b78565b610cf9565b3480156104b957600080fd5b5061047f60185481565b3480156104cf57600080fd5b506103886104de366004612aeb565b610d53565b3480156104ef57600080fd5b506103886104fe366004612bee565b610db3565b34801561050f57600080fd5b5061047f61103a565b34801561052457600080fd5b5061047f60135481565b34801561053a57600080fd5b50610388610549366004612c4d565b61105d565b34801561055a57600080fd5b50610388610569366004612c7d565b611107565b34801561057a57600080fd5b5061040d610589366004612b5f565b611190565b34801561059a57600080fd5b506103886105a9366004612b78565b61123c565b6103886105bc366004612d80565b611347565b3480156105cd57600080fd5b506103886105dc366004612dc5565b611474565b3480156105ed57600080fd5b5061043a6daaeb6d7670e522a718067333cd4e81565b34801561060f57600080fd5b5061038861061e366004612b5f565b6114cb565b34801561062f57600080fd5b5061038861063e366004612c7d565b6114fa565b34801561064f57600080fd5b506103aa61065e366004612b5f565b600b6020526000908152604090205460ff1681565b34801561067f57600080fd5b5060125461047f565b34801561069457600080fd5b506103aa6106a3366004612b5f565b6000908152600b602052604090205460ff1690565b3480156106c457600080fd5b506103aa6106d3366004612aeb565b60106020526000908152604090205460ff1681565b3480156106f457600080fd5b50610388610703366004612e56565b61157d565b34801561071457600080fd5b5061047f610723366004612b78565b6001600160a01b03919091166000908152601b60209081526040808320938352929052205490565b34801561075757600080fd5b5061043a610766366004612b5f565b6115ef565b34801561077757600080fd5b50610388610786366004612b5f565b61164f565b34801561079757600080fd5b506103886107a6366004612aeb565b61167e565b3480156107b757600080fd5b5061040d6116e4565b3480156107cc57600080fd5b506103886107db366004612aeb565b6116f1565b3480156107ec57600080fd5b506103886107fb366004612b5f565b61173d565b34801561080c57600080fd5b5061047f61081b366004612aeb565b61176c565b34801561082c57600080fd5b506103886117f2565b34801561084157600080fd5b506103aa610850366004612e9f565b611828565b34801561086157600080fd5b50610388610870366004612b5f565b611887565b34801561088157600080fd5b506103aa610890366004612aeb565b600a6020526000908152604090205460ff1681565b3480156108b157600080fd5b506108da6108c0366004612b5f565b6000908152601a6020526040902080546001909101549091565b604080519283526020830191909152016103b6565b3480156108fb57600080fd5b50600c546001600160a01b031661043a565b34801561091957600080fd5b50610388610928366004612b5f565b6118b6565b34801561093957600080fd5b5061040d6118e5565b34801561094e57600080fd5b5060145461047f565b34801561096357600080fd5b5061043a610972366004612b5f565b506015546001600160a01b031690565b34801561098e57600080fd5b5061047f61099d366004612b5f565b5060165490565b3480156109b057600080fd5b506103886109bf366004612aeb565b6118f4565b3480156109d057600080fd5b5061043a6109df366004612ab2565b6000602081905290815260409020546001600160a01b031681565b348015610a0657600080fd5b50610388610a15366004612f04565b611940565b348015610a2657600080fd5b50610388610a35366004612f04565b61198c565b348015610a4657600080fd5b5061047f60175481565b348015610a5c57600080fd5b50610388610a6b366004612f30565b611a51565b348015610a7c57600080fd5b5061047f610a8b366004612b78565b611ab5565b348015610a9c57600080fd5b50610388610aab366004612f5c565b611af2565b348015610abc57600080fd5b50610388610acb366004612fd8565b611b7d565b348015610adc57600080fd5b5061040d610aeb366004612b5f565b611c4d565b610388610afe366004612d80565b611cdd565b348015610b0f57600080fd5b50610388610b1e366004612b5f565b611dfd565b348015610b2f57600080fd5b506103aa610b3e36600461301f565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b348015610b7857600080fd5b50610388611e7a565b348015610b8d57600080fd5b50610388610b9c366004612b78565b611eee565b348015610bad57600080fd5b50610388610bbc366004612aeb565b611f8c565b348015610bcd57600080fd5b5061047f610bdc366004612b5f565b601d6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480610c1f57506001600160e01b03198216635b5e139f60e01b145b80610c3a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610c4f90613052565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7b90613052565b8015610cc85780601f10610c9d57610100808354040283529160200191610cc8565b820191906000526020600020905b815481529060010190602001808311610cab57829003601f168201915b5050505050905090565b6000610cdd82612027565b506000908152600860205260409020546001600160a01b031690565b81610d0381612086565b6001600160a01b0383166000908152600a602052604090205460ff16610d445760405162461bcd60e51b8152600401610d3b9061308c565b60405180910390fd5b610d4e838361213f565b505050565b600c546001600160a01b03163314610d7d5760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b03166000908152601060209081526040808320805460ff19908116909155600a90925290912080549091169055565b333214610de85760405162461bcd60e51b815260206004820152600360248201526231303160e81b6044820152606401610d3b565b6000818152601a6020526040902054421015610e3d5760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081cdd185c9d1959081e595d60621b6044820152606401610d3b565b6000818152601a60205260409020600101544210610e8e5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481a185cc8195b99195960921b6044820152606401610d3b565b336000908152601b60209081526040808320848452909152812054610eb490849061310e565b9050610ec33386868486611828565b610edf5760405162461bcd60e51b8152600401610d3b90613121565b610ef183610eeb61103a565b9061224f565b6012541015610f2c5760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d3b565b600d54805b610f3b858361310e565b811015610f9257610f4e33600d5461225b565b600d80546000908152600b60205260408120805460ff19166001881417905581549190610f7a83613148565b91905055508080610f8a90613148565b915050610f31565b5060006001600d54610fa49190613161565b336000908152601b60209081526040808320888452909152902054909150610fcd90869061310e565b336000818152601b60209081526040808320898452825291829020939093558051858152928301849052600187149083015260608201527fb6502a18f7b13e30f9a0efb62bfb56933b3a3104595a3cdf219b0227f271ecdc9060800160405180910390a150505050505050565b60006001600e54600d5461104e9190613161565b6110589190613161565b905090565b3360009081526010602052604090205460ff1661108c5760405162461bcd60e51b8152600401610d3b90613121565b6000828152600b602052604090205481151560ff9091161515036110e75760405162461bcd60e51b81526020600482015260126024820152711cdd185d1d5cc8185b1c9958591e481cd95d60721b6044820152606401610d3b565b6000918252600b6020526040909120805460ff1916911515919091179055565b826001600160a01b03811633146111215761112133612086565b336000908152600a602052604090205460ff166111505760405162461bcd60e51b8152600401610d3b9061308c565b6000828152600b602052604090205460ff161561117f5760405162461bcd60e51b8152600401610d3b90613174565b61118a848484612279565b50505050565b600181815481106111a057600080fd5b9060005260206000200160009150905080546111bb90613052565b80601f01602080910402602001604051908101604052809291908181526020018280546111e790613052565b80156112345780601f1061120957610100808354040283529160200191611234565b820191906000526020600020905b81548152906001019060200180831161121757829003601f168201915b505050505081565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b8152600401610d3b90613121565b8061127461103a565b61127e919061310e565b60125410156112c25760405162461bcd60e51b815260206004820152601060248201526f657863656564696e6720737570706c7960801b6044820152606401610d3b565b600d545b818101600d5410156112ec576112de83600d546122aa565b600d805460010190556112c6565b600d5460408051838152600019909201602083015281018390526001600160a01b03841660608201527faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e5169060800160405180910390a1505050565b81513490600510156113975760405162461bcd60e51b81526020600482015260196024820152786e6f74206d6f7265207468616e203520746f6b656e2069647360381b6044820152606401610d3b565b601e546040516000916001600160a01b03169083908381818185875af1925050503d80600081146113e4576040519150601f19603f3d011682016040523d82523d6000602084013e6113e9565b606091505b50509050806114325760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d3b565b7ecdb41d94af2c216b4786938844cfdc35283f2aefae511d22a041792d78abe18433848660405161146694939291906131de565b60405180910390a150505050565b600c546001600160a01b0316331461149e5760405162461bcd60e51b8152600401610d3b906130c3565b600091825260116020908152604080842094909455601c9052919020805460ff1916911515919091179055565b600c546001600160a01b031633146114f55760405162461bcd60e51b8152600401610d3b906130c3565b601655565b826001600160a01b03811633146115145761151433612086565b336000908152600a602052604090205460ff166115435760405162461bcd60e51b8152600401610d3b9061308c565b6000828152600b602052604090205460ff16156115725760405162461bcd60e51b8152600401610d3b90613174565b61118a8484846123ec565b600c546001600160a01b031633146115a75760405162461bcd60e51b8152600401610d3b906130c3565b600f6115b38282613264565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72600f6040516115e49190613324565b60405180910390a150565b6000818152600660205260408120546001600160a01b031680610c3a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d3b565b600c546001600160a01b031633146116795760405162461bcd60e51b8152600401610d3b906130c3565b601355565b600c546001600160a01b031633146116a85760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b031660009081526010602090815260408083208054600160ff199182168117909255600a909352922080549091169091179055565b600f80546111bb90613052565b600c546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610d3b906130c3565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b031633146117675760405162461bcd60e51b8152600401610d3b906130c3565b601255565b60006001600160a01b0382166117d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d3b565b506001600160a01b031660009081526007602052604090205490565b600c546001600160a01b0316331461181c5760405162461bcd60e51b8152600401610d3b906130c3565b6118266000612407565b565b600061187d6118378785611ab5565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152601160205260409020549250612459915050565b9695505050505050565b600c546001600160a01b031633146118b15760405162461bcd60e51b8152600401610d3b906130c3565b601855565b600c546001600160a01b031633146118e05760405162461bcd60e51b8152600401610d3b906130c3565b601455565b606060058054610c4f90613052565b600c546001600160a01b0316331461191e5760405162461bcd60e51b8152600401610d3b906130c3565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b8161194a81612086565b6001600160a01b0383166000908152600a602052604090205460ff166119825760405162461bcd60e51b8152600401610d3b9061308c565b610d4e838361246e565b600c546001600160a01b031633146119b65760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b0382166000908152600a602052604090205481151560ff909116151503611a265760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610d3b565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600c546001600160a01b03163314611a7b5760405162461bcd60e51b8152600401610d3b906130c3565b6040805160608101825293845260208085019384526000858301818152938152601a90915220925183559051600183015551600290910155565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b836001600160a01b0381163314611b0c57611b0c33612086565b336000908152600a602052604090205460ff16611b3b5760405162461bcd60e51b8152600401610d3b9061308c565b6000838152600b602052604090205460ff1615611b6a5760405162461bcd60e51b8152600401610d3b90613174565b611b7685858585612479565b5050505050565b3360009081526010602052604090205460ff16611bac5760405162461bcd60e51b8152600401610d3b90613121565b60005b8251811015611c0f5781600b6000858481518110611bcf57611bcf6133af565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c0790613148565b915050611baf565b507fc55a0de0f0b6c1b85d9c52787d91c8068c5a331e926fb9e3c575b435e97fe14f8282604051611c419291906133c5565b60405180910390a15050565b6000818152600660205260409020546060906001600160a01b0316611ccc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d3b565b6000611cd66124ab565b9392505050565b8151349060051015611d2d5760405162461bcd60e51b81526020600482015260196024820152786e6f74206d6f7265207468616e203520746f6b656e2069647360381b6044820152606401610d3b565b601e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611d7a576040519150601f19603f3d011682016040523d82523d6000602084013e611d7f565b606091505b5050905080611dc85760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d3b565b7f9d3fc7c6858672d62378c66aabf170a70b98ed6283ed4d2367fa23ae47c6cff88433848660405161146694939291906131de565b3360009081526010602052604090205460ff16611e2c5760405162461bcd60e51b8152600401610d3b90613121565b600e8054906000611e3c83613148565b9190505550611e4a816124ba565b6040518181527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb906020016115e4565b3360009081526010602052604090205460ff16611ea95760405162461bcd60e51b8152600401610d3b90613121565b600d5415611ee75760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610d3b565b6001600d55565b3360009081526010602052604090205460ff16611f1d5760405162461bcd60e51b8152600401610d3b90613121565b6000611f28826115ef565b6000838152600b602052604090205490915060ff1615611f81576000828152600b60205260409020805460ff19169055611f63818484612555565b6000828152600b60205260409020805460ff19166001179055505050565b610d4e818484612555565b600c546001600160a01b03163314611fb65760405162461bcd60e51b8152600401610d3b906130c3565b6001600160a01b03811661201b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3b565b61202481612407565b50565b6000818152600660205260409020546001600160a01b03166120245760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d3b565b6daaeb6d7670e522a718067333cd4e3b1561202457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211791906133e9565b61202457604051633b79c77360e21b81526001600160a01b0382166004820152602401610d3b565b600061214a826115ef565b9050806001600160a01b0316836001600160a01b0316036121b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d3b565b336001600160a01b03821614806121d357506121d38133610b3e565b6122455760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d3b565b610d4e83836126f1565b6000611cd6828461310e565b61227582826040518060200160405280600081525061275f565b5050565b6122833382612792565b61229f5760405162461bcd60e51b8152600401610d3b90613406565b610d4e838383612555565b6001600160a01b0382166123005760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d3b565b6000818152600660205260409020546001600160a01b0316156123655760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d3b565b6001600160a01b038216600090815260076020526040812080546001929061238e90849061310e565b909155505060008181526006602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610d4e83838360405180602001604052806000815250611af2565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612466838386612810565b949350505050565b612275338383612826565b6124833383612792565b61249f5760405162461bcd60e51b8152600401610d3b90613406565b61118a848484846128f4565b6060600f8054610c4f90613052565b60006124c5826115ef565b90506124d26000836126f1565b6001600160a01b03811660009081526007602052604081208054600192906124fb908490613161565b909155505060008281526006602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b826001600160a01b0316612568826115ef565b6001600160a01b0316146125cc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d3b565b6001600160a01b03821661262e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3b565b6126396000826126f1565b6001600160a01b0383166000908152600760205260408120805460019290612662908490613161565b90915550506001600160a01b038216600090815260076020526040812080546001929061269090849061310e565b909155505060008181526006602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260086020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612726826115ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61276983836122aa565b6127766000848484612927565b610d4e5760405162461bcd60e51b8152600401610d3b90613454565b60008061279e836115ef565b9050806001600160a01b0316846001600160a01b031614806127e557506001600160a01b0380821660009081526009602090815260408083209388168352929052205460ff165b806124665750836001600160a01b03166127fe84610cd2565b6001600160a01b031614949350505050565b60008261281d8584612a28565b14949350505050565b816001600160a01b0316836001600160a01b0316036128875760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d3b565b6001600160a01b03838116600081815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128ff848484612555565b61290b84848484612927565b61118a5760405162461bcd60e51b8152600401610d3b90613454565b60006001600160a01b0384163b15612a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061296b9033908990889088906004016134a6565b6020604051808303816000875af19250505080156129a6575060408051601f3d908101601f191682019092526129a3918101906134d9565b60015b612a03573d8080156129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b5080516000036129fb5760405162461bcd60e51b8152600401610d3b90613454565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612466565b506001949350505050565b600081815b8451811015612a94576000858281518110612a4a57612a4a6133af565b60200260200101519050808311612a705760008381526020829052604090209250612a81565b600081815260208490526040902092505b5080612a8c81613148565b915050612a2d565b509392505050565b6001600160e01b03198116811461202457600080fd5b600060208284031215612ac457600080fd5b8135611cd681612a9c565b80356001600160a01b0381168114612ae657600080fd5b919050565b600060208284031215612afd57600080fd5b611cd682612acf565b6000815180845260005b81811015612b2c57602081850181015186830182015201612b10565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611cd66020830184612b06565b600060208284031215612b7157600080fd5b5035919050565b60008060408385031215612b8b57600080fd5b612b9483612acf565b946020939093013593505050565b60008083601f840112612bb457600080fd5b50813567ffffffffffffffff811115612bcc57600080fd5b6020830191508360208260051b8501011115612be757600080fd5b9250929050565b60008060008060608587031215612c0457600080fd5b843567ffffffffffffffff811115612c1b57600080fd5b612c2787828801612ba2565b90989097506020870135966040013595509350505050565b801515811461202457600080fd5b60008060408385031215612c6057600080fd5b823591506020830135612c7281612c3f565b809150509250929050565b600080600060608486031215612c9257600080fd5b612c9b84612acf565b9250612ca960208501612acf565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cf857612cf8612cb9565b604052919050565b600082601f830112612d1157600080fd5b8135602067ffffffffffffffff821115612d2d57612d2d612cb9565b8160051b612d3c828201612ccf565b9283528481018201928281019087851115612d5657600080fd5b83870192505b84831015612d7557823582529183019190830190612d5c565b979650505050505050565b60008060408385031215612d9357600080fd5b823567ffffffffffffffff811115612daa57600080fd5b612db685828601612d00565b95602094909401359450505050565b600080600060608486031215612dda57600080fd5b83359250602084013591506040840135612df381612c3f565b809150509250925092565b600067ffffffffffffffff831115612e1857612e18612cb9565b612e2b601f8401601f1916602001612ccf565b9050828152838383011115612e3f57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612e6857600080fd5b813567ffffffffffffffff811115612e7f57600080fd5b8201601f81018413612e9057600080fd5b61246684823560208401612dfe565b600080600080600060808688031215612eb757600080fd5b612ec086612acf565b9450602086013567ffffffffffffffff811115612edc57600080fd5b612ee888828901612ba2565b9699909850959660408101359660609091013595509350505050565b60008060408385031215612f1757600080fd5b612f2083612acf565b91506020830135612c7281612c3f565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612f7257600080fd5b612f7b85612acf565b9350612f8960208601612acf565b925060408501359150606085013567ffffffffffffffff811115612fac57600080fd5b8501601f81018713612fbd57600080fd5b612fcc87823560208401612dfe565b91505092959194509250565b60008060408385031215612feb57600080fd5b823567ffffffffffffffff81111561300257600080fd5b61300e85828601612d00565b9250506020830135612c7281612c3f565b6000806040838503121561303257600080fd5b61303b83612acf565b915061304960208401612acf565b90509250929050565b600181811c9082168061306657607f821691505b60208210810361308657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c3a57610c3a6130f8565b6020808252600d908201526c6e6f7420617574686f72697a6560981b604082015260600190565b60006001820161315a5761315a6130f8565b5060010190565b81810381811115610c3a57610c3a6130f8565b602080825260159082015274115490cdcc8c4e88139195081a5cc81b1bd8dad959605a1b604082015260600190565b600081518084526020808501945080840160005b838110156131d3578151875295820195908201906001016131b7565b509495945050505050565b6080815260006131f160808301876131a3565b6001600160a01b03959095166020830152506040810192909252606090910152919050565b601f821115610d4e57600081815260208120601f850160051c8101602086101561323d5750805b601f850160051c820191505b8181101561325c57828155600101613249565b505050505050565b815167ffffffffffffffff81111561327e5761327e612cb9565b6132928161328c8454613052565b84613216565b602080601f8311600181146132c757600084156132af5750858301515b600019600386901b1c1916600185901b17855561325c565b600085815260208120601f198616915b828110156132f6578886015182559484019460019091019084016132d7565b50858210156133145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083526000845461333881613052565b808487015260406001808416600081146133595760018114613373576133a1565b60ff1985168984015283151560051b8901830195506133a1565b896000528660002060005b858110156133995781548b820186015290830190880161337e565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6040815260006133d860408301856131a3565b905082151560208301529392505050565b6000602082840312156133fb57600080fd5b8151611cd681612c3f565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061187d90830184612b06565b6000602082840312156134eb57600080fd5b8151611cd681612a9c56fea2646970667358221220177c28e12de771427009f1b4d2fc0d209f81eb67a66572fa3a217519f33906fd64736f6c63430008110033
Deployed Bytecode Sourcemap
61207:9365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23287:305;;;;;;;;;;-1:-1:-1;23287:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;23287:305:0;;;;;;;;67711:123;;;;;;;;;;-1:-1:-1;67711:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;67801:27:0;67779:4;67801:27;;;:17;:27;;;;;;;;;67711:123;24214:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25727:171::-;;;;;;;;;;-1:-1:-1;25727:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1963:32:1;;;1945:51;;1933:2;1918:18;25727:171:0;1799:203:1;67477:121:0;;;;;;;;;;-1:-1:-1;67477:121:0;;;;;:::i;:::-;67541:7;67565:27;;;:13;:27;;;;;;;67477:121;;;;2153:25:1;;;2141:2;2126:18;67477:121:0;2007:177:1;48310:237:0;;;;;;;;;;-1:-1:-1;48310:237:0;;;;;:::i;:::-;;:::i;50062:35::-;;;;;;;;;;;;;;;;65831:139;;;;;;;;;;-1:-1:-1;65831:139:0;;;;;:::i;:::-;;:::i;63372:956::-;;;;;;;;;;-1:-1:-1;63372:956:0;;;;;:::i;:::-;;:::i;61801:95::-;;;;;;;;;;;;;:::i;49918:21::-;;;;;;;;;;;;;;;;67840:175;;;;;;;;;;-1:-1:-1;67840:175:0;;;;;:::i;:::-;;:::i;48601:305::-;;;;;;;;;;-1:-1:-1;48601:305:0;;;;;:::i;:::-;;:::i;821:29::-;;;;;;;;;;-1:-1:-1;821:29:0;;;;;:::i;:::-;;:::i;62842:392::-;;;;;;;;;;-1:-1:-1;62842:392:0;;;;;:::i;:::-;;:::i;64722:378::-;;;;;;:::i;:::-;;:::i;65976:200::-;;;;;;;;;;-1:-1:-1;65976:200:0;;;;;:::i;:::-;;:::i;44191:143::-;;;;;;;;;;;;43000:42;44191:143;;68268:86;;;;;;;;;;-1:-1:-1;68268:86:0;;;;;:::i;:::-;;:::i;48914:314::-;;;;;;;;;;-1:-1:-1;48914:314:0;;;;;:::i;:::-;;:::i;47725:39::-;;;;;;;;;;-1:-1:-1;47725:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;67389:82;;;;;;;;;;-1:-1:-1;67456:9:0;;67389:82;;67604:101;;;;;;;;;;-1:-1:-1;67604:101:0;;;;;:::i;:::-;67661:4;67683:16;;;:7;:16;;;;;;;;;67604:101;49777:45;;;;;;;;;;-1:-1:-1;49777:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68674:122;;;;;;;;;;-1:-1:-1;68674:122:0;;;;;:::i;:::-;;:::i;61902:142::-;;;;;;;;;;-1:-1:-1;61902:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;62009:16:0;;;;61988:7;62009:16;;;:10;:16;;;;;;;;:31;;;;;;;;;61902:142;23925:222;;;;;;;;;;-1:-1:-1;23925:222:0;;;;;:::i;:::-;;:::i;66713:81::-;;;;;;;;;;-1:-1:-1;66713:81:0;;;;;:::i;:::-;;:::i;65693:134::-;;;;;;;;;;-1:-1:-1;65693:134:0;;;;;:::i;:::-;;:::i;49753:21::-;;;;;;;;;;;;;:::i;65106:92::-;;;;;;;;;;-1:-1:-1;65106:92:0;;;;;:::i;:::-;;:::i;66404:87::-;;;;;;;;;;-1:-1:-1;66404:87:0;;;;;:::i;:::-;;:::i;23656:207::-;;;;;;;;;;-1:-1:-1;23656:207:0;;;;;:::i;:::-;;:::i;52135:94::-;;;;;;;;;;;;;:::i;62046:230::-;;;;;;;;;;-1:-1:-1;62046:230:0;;;;;:::i;:::-;;:::i;66182:123::-;;;;;;;;;;-1:-1:-1;66182:123:0;;;;;:::i;:::-;;:::i;47669:49::-;;;;;;;;;;-1:-1:-1;47669:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;66986:223;;;;;;;;;;-1:-1:-1;66986:223:0;;;;;:::i;:::-;67055:18;67113:27;;;:12;:27;;;;;:37;;67168:35;;;;;67113:37;;66986:223;;;;;8440:25:1;;;8496:2;8481:18;;8474:34;;;;8413:18;66986:223:0;8266:248:1;51484:87:0;;;;;;;;;;-1:-1:-1;51557:6:0;;-1:-1:-1;;;;;51557:6:0;51484:87;;67215:82;;;;;;;;;;-1:-1:-1;67215:82:0;;;;;:::i;:::-;;:::i;24383:104::-;;;;;;;;;;;;;:::i;67303:80::-;;;;;;;;;;-1:-1:-1;67368:9:0;;67303:80;;68360:92;;;;;;;;;;-1:-1:-1;68360:92:0;;;;;:::i;:::-;-1:-1:-1;68440:6:0;;-1:-1:-1;;;;;68440:6:0;;68360:92;68458:97;;;;;;;;;;-1:-1:-1;68458:97:0;;;;;:::i;:::-;-1:-1:-1;68542:7:0;;;68458:97;66321:77;;;;;;;;;;-1:-1:-1;66321:77:0;;;;;:::i;:::-;;:::i;705:43::-;;;;;;;;;;-1:-1:-1;705:43:0;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;705:43:0;;;48047:255;;;;;;;;;;-1:-1:-1;48047:255:0;;;;;:::i;:::-;;:::i;66497:208::-;;;;;;;;;;-1:-1:-1;66497:208:0;;;;;:::i;:::-;;:::i;50035:23::-;;;;;;;;;;;;;;;;66800:180;;;;;;;;;;-1:-1:-1;66800:180:0;;;;;:::i;:::-;;:::i;62282:146::-;;;;;;;;;;-1:-1:-1;62282:146:0;;;;;:::i;:::-;;:::i;49236:338::-;;;;;;;;;;-1:-1:-1;49236:338:0;;;;;:::i;:::-;;:::i;68021:241::-;;;;;;;;;;-1:-1:-1;68021:241:0;;;;;:::i;:::-;;:::i;68975:256::-;;;;;;;;;;-1:-1:-1;68975:256:0;;;;;:::i;:::-;;:::i;64334:382::-;;;;;;:::i;:::-;;:::i;65210:123::-;;;;;;;;;;-1:-1:-1;65210:123:0;;;;;:::i;:::-;;:::i;26196:164::-;;;;;;;;;;-1:-1:-1;26196:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26317:25:0;;;26293:4;26317:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26196:164;63242:116;;;;;;;;;;;;;:::i;65339:343::-;;;;;;;;;;-1:-1:-1;65339:343:0;;;;;:::i;:::-;;:::i;52384:192::-;;;;;;;;;;-1:-1:-1;52384:192:0;;;;;:::i;:::-;;:::i;50406:46::-;;;;;;;;;;-1:-1:-1;50406:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;23287:305;23389:4;-1:-1:-1;;;;;;23426:40:0;;-1:-1:-1;;;23426:40:0;;:105;;-1:-1:-1;;;;;;;23483:48:0;;-1:-1:-1;;;23483:48:0;23426:105;:158;;;-1:-1:-1;;;;;;;;;;21825:40:0;;;23548:36;23406:178;23287:305;-1:-1:-1;;23287:305:0:o;24214:100::-;24268:13;24301:5;24294:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24214:100;:::o;25727:171::-;25803:7;25823:23;25838:7;25823:14;:23::i;:::-;-1:-1:-1;25866:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25866:24:0;;25727:171::o;48310:237::-;48407:8;45973:30;45994:8;45973:20;:30::i;:::-;-1:-1:-1;;;;;48437:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;48429:67;;;;-1:-1:-1::0;;;48429:67:0::1;;;;;;;:::i;:::-;;;;;;;;;48507:32;48521:8;48531:7;48507:13;:32::i;:::-;48310:237:::0;;;:::o;65831:139::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65899:19:0::1;65921:5;65899:19:::0;;;:13:::1;:19;::::0;;;;;;;:27;;-1:-1:-1;;65899:27:0;;::::1;::::0;;;65933:17:::1;:23:::0;;;;;;:31;;;;::::1;::::0;;65831:139::o;63372:956::-;63474:10;63488:9;63474:23;63466:39;;;;-1:-1:-1;;;63466:39:0;;11884:2:1;63466:39:0;;;11866:21:1;11923:1;11903:18;;;11896:29;-1:-1:-1;;;11941:18:1;;;11934:33;11984:18;;63466:39:0;11682:326:1;63466:39:0;63520:27;;;;:12;:27;;;;;:37;63561:15;-1:-1:-1;63520:56:0;63512:89;;;;-1:-1:-1;;;63512:89:0;;12215:2:1;63512:89:0;;;12197:21:1;12254:2;12234:18;;;12227:30;-1:-1:-1;;;12273:18:1;;;12266:50;12333:18;;63512:89:0;12013:344:1;63512:89:0;63616:27;;;;:12;:27;;;;;:35;;;63654:15;-1:-1:-1;63608:80:0;;;;-1:-1:-1;;;63608:80:0;;12564:2:1;63608:80:0;;;12546:21:1;12603:2;12583:18;;;12576:30;-1:-1:-1;;;12622:18:1;;;12615:44;12676:18;;63608:80:0;12362:338:1;63608:80:0;63726:10;63695:16;63715:22;;;:10;:22;;;;;;;;:37;;;;;;;;;:45;;63755:5;;63715:45;:::i;:::-;63695:65;;63775:56;63789:10;63801:5;;63808:8;63817:13;63775;:56::i;:::-;63767:82;;;;-1:-1:-1;;;63767:82:0;;;;;;;:::i;:::-;63884:24;63902:5;63884:13;:11;:13::i;:::-;:17;;:24::i;:::-;63871:9;;:37;;63863:57;;;;-1:-1:-1;;;63863:57:0;;13511:2:1;63863:57:0;;;13493:21:1;13550:1;13530:18;;;13523:29;-1:-1:-1;;;13568:18:1;;;13561:37;13615:18;;63863:57:0;13309:330:1;63863:57:0;63949:8;;;63964:175;63999:12;64006:5;63999:4;:12;:::i;:::-;63991:5;:20;63964:175;;;64032:31;64042:10;64054:8;;64032:9;:31::i;:::-;64081:8;;;64073:17;;;;:7;:17;;;;;:38;;-1:-1:-1;;64073:38:0;64110:1;64093:18;;64073:38;;;64121:10;;;64081:8;64121:10;;;:::i;:::-;;;;;;64013:7;;;;;:::i;:::-;;;;63964:175;;;;64145:10;64169:1;64158:8;;:12;;;;:::i;:::-;64227:10;64216:22;;;;:10;:22;;;;;;;;:37;;;;;;;;;64145:25;;-1:-1:-1;64216:44:0;;64255:5;;64216:44;:::i;:::-;64188:10;64177:22;;;;:10;:22;;;;;;;;:37;;;;;;;;;:83;;;;64273:49;;14142:25:1;;;14183:18;;;14176:34;;;64308:1:0;64291:18;;14226::1;;;14219:50;14300:2;14285:18;;14278:60;64273:49:0;;14129:3:1;14114:19;64273:49:0;;;;;;;63459:869;;;63372:956;;;;:::o;61801:95::-;61844:7;61889:1;61877:9;;61866:8;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;61859:31;;61801:95;:::o;67840:175::-;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;67928:16:::1;::::0;;;:7:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;67920:57:::1;;;::::0;-1:-1:-1;;;67920:57:0;;14551:2:1;67920:57:0::1;::::0;::::1;14533:21:1::0;14590:2;14570:18;;;14563:30;-1:-1:-1;;;14609:18:1;;;14602:48;14667:18;;67920:57:0::1;14349:342:1::0;67920:57:0::1;67984:16;::::0;;;:7:::1;:16;::::0;;;;;:25;;-1:-1:-1;;67984:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67840:175::o;48601:305::-;48702:4;-1:-1:-1;;;;;45699:18:0;;45707:10;45699:18;45695:83;;45734:32;45755:10;45734:20;:32::i;:::-;48746:10:::1;48728:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;48720:69;;;;-1:-1:-1::0;;;48720:69:0::1;;;;;;;:::i;:::-;48809:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;48808:17;48800:50;;;;-1:-1:-1::0;;;48800:50:0::1;;;;;;;:::i;:::-;48861:37;48880:4;48886:2;48890:7;48861:18;:37::i;:::-;48601:305:::0;;;;:::o;821:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62842:392::-;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;62952:10:::1;62937:13;:11;:13::i;:::-;:25;;;;:::i;:::-;62924:9;;:38;;62916:67;;;::::0;-1:-1:-1;;;62916:67:0;;15248:2:1;62916:67:0::1;::::0;::::1;15230:21:1::0;15287:2;15267:18;;;15260:30;-1:-1:-1;;;15306:18:1;;;15299:46;15362:18;;62916:67:0::1;15046:340:1::0;62916:67:0::1;63026:8;::::0;63045:113:::1;63079:10;63071:5;:18;63060:8;;:29;63045:113;;;63115:20;63121:3;63126:8;;63115:5;:20::i;:::-;63091:8;:10:::0;;::::1;;::::0;;63045:113:::1;;;63185:8;::::0;63173:42:::1;::::0;;15622:25:1;;;-1:-1:-1;;63185:12:0;;;15678:2:1;15663:18;;15656:34;15706:18;;15699:34;;;-1:-1:-1;;;;;15769:32:1;;15764:2;15749:18;;15742:60;63173:42:0::1;::::0;15609:3:1;15594:19;63173:42:0::1;;;;;;;62990:233;62842:392:::0;;:::o;64722:378::-;64852:15;;64828:9;;64871:1;-1:-1:-1;64852:20:0;64844:58;;;;-1:-1:-1;;;64844:58:0;;16015:2:1;64844:58:0;;;15997:21:1;16054:2;16034:18;;;16027:30;-1:-1:-1;;;16073:18:1;;;16066:55;16138:18;;64844:58:0;15813:349:1;64844:58:0;64935:12;;64927:52;;64910:12;;-1:-1:-1;;;;;64935:12:0;;64961:13;;64910:12;64927:52;64910:12;64927:52;64961:13;64935:12;64927:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64909:70;;;64990:7;64986:44;;64999:31;;-1:-1:-1;;;64999:31:0;;16579:2:1;64999:31:0;;;16561:21:1;16618:2;16598:18;;;16591:30;-1:-1:-1;;;16637:18:1;;;16630:51;16698:18;;64999:31:0;16377:345:1;64986:44:0;65042:52;65054:8;65063:10;65074:13;65089:4;65042:52;;;;;;;;;:::i;:::-;;;;;;;;64797:303;;64722:378;;:::o;65976:200::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66082:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;:36;;;;66125:18:::1;:33:::0;;;;;:45;;-1:-1:-1;;66125:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65976:200::o;68268:86::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;68331:7:::1;:17:::0;68268:86::o;48914:314::-;49019:4;-1:-1:-1;;;;;45699:18:0;;45707:10;45699:18;45695:83;;45734:32;45755:10;45734:20;:32::i;:::-;49064:10:::1;49046:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;49038:69;;;;-1:-1:-1::0;;;49038:69:0::1;;;;;;;:::i;:::-;49127:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;49126:17;49118:50;;;;-1:-1:-1::0;;;49118:50:0::1;;;;;;;:::i;:::-;49179:41;49202:4;49208:2;49212:7;49179:22;:41::i;68674:122::-:0;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;68744:7:::1;:18;68754:8:::0;68744:7;:18:::1;:::i;:::-;;68774:16;68782:7;68774:16;;;;;;:::i;:::-;;;;;;;;68674:122:::0;:::o;23925:222::-;23997:7;24033:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24033:16:0;;24060:56;;;;-1:-1:-1;;;24060:56:0;;21048:2:1;24060:56:0;;;21030:21:1;21087:2;21067:18;;;21060:30;-1:-1:-1;;;21106:18:1;;;21099:54;21170:18;;24060:56:0;20846:348:1;66713:81:0;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66773:6:::1;:15:::0;66713:81::o;65693:134::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65758:19:0::1;;::::0;;;:13:::1;:19;::::0;;;;;;;:26;;65780:4:::1;-1:-1:-1::0;;65758:26:0;;::::1;::::0;::::1;::::0;;;65791:17:::1;:23:::0;;;;;:30;;;;::::1;::::0;;::::1;::::0;;65693:134::o;49753:21::-;;;;;;;:::i;65106:92::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;65173:12:::1;:19:::0;;-1:-1:-1;;;;;;65173:19:0::1;-1:-1:-1::0;;;;;65173:19:0;;;::::1;::::0;;;::::1;::::0;;65106:92::o;66404:87::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66468:9:::1;:17:::0;66404:87::o;23656:207::-;23728:7;-1:-1:-1;;;;;23756:19:0;;23748:73;;;;-1:-1:-1;;;23748:73:0;;21401:2:1;23748:73:0;;;21383:21:1;21440:2;21420:18;;;21413:30;21479:34;21459:18;;;21452:62;-1:-1:-1;;;21530:18:1;;;21523:39;21579:19;;23748:73:0;21199:405:1;23748:73:0;-1:-1:-1;;;;;;23839:16:0;;;;;:9;:16;;;;;;;23656:207::o;52135:94::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;52200:21:::1;52218:1;52200:9;:21::i;:::-;52135:94::o:0;62046:230::-;62174:4;62198:70;62206:24;62212:7;62221:8;62206:5;:24::i;:::-;62232:5;;62198:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62239:28:0;;;:13;:28;;;;;;;-1:-1:-1;62198:7:0;;-1:-1:-1;;62198:70:0:i;:::-;62191:77;62046:230;-1:-1:-1;;;;;;62046:230:0:o;66182:123::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66261:20:::1;:32:::0;66182:123::o;67215:82::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;67274:9:::1;:17:::0;67215:82::o;24383:104::-;24439:13;24472:7;24465:14;;;;;:::i;66321:77::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66380:6:::1;:12:::0;;-1:-1:-1;;;;;;66380:12:0::1;-1:-1:-1::0;;;;;66380:12:0;;;::::1;::::0;;;::::1;::::0;;66321:77::o;48047:255::-;48151:8;45973:30;45994:8;45973:20;:30::i;:::-;-1:-1:-1;;;;;48181:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;48173:67;;;;-1:-1:-1::0;;;48173:67:0::1;;;;;;;:::i;:::-;48251:43;48275:8;48285;48251:23;:43::i;66497:208::-:0;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66588:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;:33;::::1;;:23;::::0;;::::1;:33;;::::0;66580:74:::1;;;::::0;-1:-1:-1;;;66580:74:0;;21811:2:1;66580:74:0::1;::::0;::::1;21793:21:1::0;21850:2;21830:18;;;21823:30;21889;21869:18;;;21862:58;21937:18;;66580:74:0::1;21609:352:1::0;66580:74:0::1;-1:-1:-1::0;;;;;66665:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:32;;-1:-1:-1;;66665:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66497:208::o;66800:180::-;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;66939:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;66939:35:0;;;;;;66909:27;;;:12:::1;:27:::0;;;;:65;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;66800:180::o;62282:146::-;62390:29;;;-1:-1:-1;;;;;22158:32:1;;62390:29:0;;;22140:51:1;22207:18;;;22200:34;;;62353:7:0;;22113:18:1;;62390:29:0;;;;;;;;;;;;62380:40;;;;;;62373:47;;62282:146;;;;:::o;49236:338::-;49360:4;-1:-1:-1;;;;;45699:18:0;;45707:10;45699:18;45695:83;;45734:32;45755:10;45734:20;:32::i;:::-;49404:10:::1;49386:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;49378:69;;;;-1:-1:-1::0;;;49378:69:0::1;;;;;;;:::i;:::-;49467:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;49466:17;49458:50;;;;-1:-1:-1::0;;;49458:50:0::1;;;;;;;:::i;:::-;49519:47;49542:4;49548:2;49552:7;49561:4;49519:22;:47::i;:::-;49236:338:::0;;;;;:::o;68021:241::-;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;68111:13:::1;68106:108;68138:8;:15;68130:5;:23;68106:108;;;68200:6;68173:7;:24;68181:8;68190:5;68181:15;;;;;;;;:::i;:::-;;;;;;;68173:24;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;68155:7;;;;;:::i;:::-;;;;68106:108;;;;68225:31;68239:8;68249:6;68225:31;;;;;;;:::i;:::-;;;;;;;;68021:241:::0;;:::o;68975:256::-;28985:4;29009:16;;;:7;:16;;;;;;69048:13;;-1:-1:-1;;;;;29009:16:0;69074:76;;;;-1:-1:-1;;;69074:76:0;;22926:2:1;69074:76:0;;;22908:21:1;22965:2;22945:18;;;22938:30;23004:34;22984:18;;;22977:62;-1:-1:-1;;;23055:18:1;;;23048:45;23110:19;;69074:76:0;22724:411:1;69074:76:0;69163:21;69187:10;:8;:10::i;:::-;69163:34;68975:256;-1:-1:-1;;;68975:256:0:o;64334:382::-;64466:15;;64442:9;;64485:1;-1:-1:-1;64466:20:0;64458:58;;;;-1:-1:-1;;;64458:58:0;;16015:2:1;64458:58:0;;;15997:21:1;16054:2;16034:18;;;16027:30;-1:-1:-1;;;16073:18:1;;;16066:55;16138:18;;64458:58:0;15813:349:1;64458:58:0;64549:12;;64541:52;;64524:12;;-1:-1:-1;;;;;64549:12:0;;64575:13;;64524:12;64541:52;64524:12;64541:52;64575:13;64549:12;64541:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64523:70;;;64604:7;64600:44;;64613:31;;-1:-1:-1;;;64613:31:0;;16579:2:1;64613:31:0;;;16561:21:1;16618:2;16598:18;;;16591:30;-1:-1:-1;;;16637:18:1;;;16630:51;16698:18;;64613:31:0;16377:345:1;64600:44:0;64656:54;64670:8;64679:10;64690:13;64705:4;64656:54;;;;;;;;;:::i;65210:123::-;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;65270:9:::1;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;;;;;;65288:14;65294:7;65288:5;:14::i;:::-;65314:13;::::0;2153:25:1;;;65314:13:0::1;::::0;2141:2:1;2126:18;65314:13:0::1;2007:177:1::0;63242:116:0;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;63302:8:::1;::::0;:13;63294:37:::1;;;::::0;-1:-1:-1;;;63294:37:0;;23342:2:1;63294:37:0::1;::::0;::::1;23324:21:1::0;23381:2;23361:18;;;23354:30;-1:-1:-1;;;23400:18:1;;;23393:41;23451:18;;63294:37:0::1;23140:335:1::0;63294:37:0::1;63351:1;63340:8;:12:::0;63242:116::o;65339:343::-;61747:10;61733:25;;;;:13;:25;;;;;;;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;65417:13:::1;65433:16;65441:7;65433;:16::i;:::-;65470;::::0;;;:7:::1;:16;::::0;;;;;65417:32;;-1:-1:-1;65470:16:0::1;;65467:202;;;65519:5;65500:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;65500:24:0::1;::::0;;65537:29:::1;65547:5:::0;65554:2;65508:7;65537:9:::1;:29::i;:::-;65579:16;::::0;;;:7:::1;:16;::::0;;;;:23;;-1:-1:-1;;65579:23:0::1;65598:4;65579:23;::::0;;48310:237;;;:::o;65467:202::-:1;65630:29;65640:5;65647:2;65651:7;65630:9;:29::i;52384:192::-:0;51557:6;;-1:-1:-1;;;;;51557:6:0;18222:10;51704:23;51696:68;;;;-1:-1:-1;;;51696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52473:22:0;::::1;52465:73;;;::::0;-1:-1:-1;;;52465:73:0;;23682:2:1;52465:73:0::1;::::0;::::1;23664:21:1::0;23721:2;23701:18;;;23694:30;23760:34;23740:18;;;23733:62;-1:-1:-1;;;23811:18:1;;;23804:36;23857:19;;52465:73:0::1;23480:402:1::0;52465:73:0::1;52549:19;52559:8;52549:9;:19::i;:::-;52384:192:::0;:::o;33702:135::-;28985:4;29009:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29009:16:0;33776:53;;;;-1:-1:-1;;;33776:53:0;;21048:2:1;33776:53:0;;;21030:21:1;21087:2;21067:18;;;21060:30;-1:-1:-1;;;21106:18:1;;;21099:54;21170:18;;33776:53:0;20846:348:1;46116:647:0;43000:42;46307:45;:49;46303:453;;46606:67;;-1:-1:-1;;;46606:67:0;;46657:4;46606:67;;;24099:34:1;-1:-1:-1;;;;;24169:15:1;;24149:18;;;24142:43;43000:42:0;;46606;;24034:18:1;;46606:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46601:144;;46701:28;;-1:-1:-1;;;46701:28:0;;-1:-1:-1;;;;;1963:32:1;;46701:28:0;;;1945:51:1;1918:18;;46701:28:0;1799:203:1;25244:417:0;25325:13;25341:23;25356:7;25341:14;:23::i;:::-;25325:39;;25389:5;-1:-1:-1;;;;;25383:11:0;:2;-1:-1:-1;;;;;25383:11:0;;25375:57;;;;-1:-1:-1;;;25375:57:0;;24648:2:1;25375:57:0;;;24630:21:1;24687:2;24667:18;;;24660:30;24726:34;24706:18;;;24699:62;-1:-1:-1;;;24777:18:1;;;24770:31;24818:19;;25375:57:0;24446:397:1;25375:57:0;18222:10;-1:-1:-1;;;;;25467:21:0;;;;:62;;-1:-1:-1;25492:37:0;25509:5;18222:10;26196:164;:::i;25492:37::-;25445:174;;;;-1:-1:-1;;;25445:174:0;;25050:2:1;25445:174:0;;;25032:21:1;25089:2;25069:18;;;25062:30;25128:34;25108:18;;;25101:62;25199:32;25179:18;;;25172:60;25249:19;;25445:174:0;24848:426:1;25445:174:0;25632:21;25641:2;25645:7;25632:8;:21::i;55641:98::-;55699:7;55726:5;55730:1;55726;:5;:::i;29820:110::-;29896:26;29906:2;29910:7;29896:26;;;;;;;;;;;;:9;:26::i;:::-;29820:110;;:::o;26427:336::-;26622:41;18222:10;26655:7;26622:18;:41::i;:::-;26614:100;;;;-1:-1:-1;;;26614:100:0;;;;;;;:::i;:::-;26727:28;26737:4;26743:2;26747:7;26727:9;:28::i;30812:439::-;-1:-1:-1;;;;;30892:16:0;;30884:61;;;;-1:-1:-1;;;30884:61:0;;25896:2:1;30884:61:0;;;25878:21:1;;;25915:18;;;25908:30;25974:34;25954:18;;;25947:62;26026:18;;30884:61:0;25694:356:1;30884:61:0;28985:4;29009:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29009:16:0;:30;30956:58;;;;-1:-1:-1;;;30956:58:0;;26257:2:1;30956:58:0;;;26239:21:1;26296:2;26276:18;;;26269:30;26335;26315:18;;;26308:58;26383:18;;30956:58:0;26055:352:1;30956:58:0;-1:-1:-1;;;;;31085:13:0;;;;;;:9;:13;;;;;:18;;31102:1;;31085:13;:18;;31102:1;;31085:18;:::i;:::-;;;;-1:-1:-1;;31114:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31114:21:0;-1:-1:-1;;;;;31114:21:0;;;;;;;;31153:33;;31114:16;;;31153:33;;31114:16;;31153:33;29820:110;;:::o;26834:185::-;26972:39;26989:4;26995:2;26999:7;26972:39;;;;;;;;;;;;:16;:39::i;52584:174::-;52660:6;;;-1:-1:-1;;;;;52677:17:0;;;-1:-1:-1;;;;;;52677:17:0;;;;;;;52710:40;;52660:6;;;52677:17;52660:6;;52710:40;;52641:16;;52710:40;52630:128;52584:174;:::o;62434:159::-;62524:4;62548:37;62567:5;62574:4;62580;62548:18;:37::i;:::-;62541:44;62434:159;-1:-1:-1;;;;62434:159:0:o;25970:155::-;26065:52;18222:10;26098:8;26108;26065:18;:52::i;27090:323::-;27264:41;18222:10;27297:7;27264:18;:41::i;:::-;27256:100;;;;-1:-1:-1;;;27256:100:0;;;;;;;:::i;:::-;27367:38;27381:4;27387:2;27391:7;27400:4;27367:13;:38::i;68801:106::-;68861:13;68892:7;68885:14;;;;;:::i;31480:420::-;31540:13;31556:23;31571:7;31556:14;:23::i;:::-;31540:39;;31681:29;31698:1;31702:7;31681:8;:29::i;:::-;-1:-1:-1;;;;;31723:16:0;;;;;;:9;:16;;;;;:21;;31743:1;;31723:16;:21;;31743:1;;31723:21;:::i;:::-;;;;-1:-1:-1;;31762:16:0;;;;:7;:16;;;;;;31755:23;;-1:-1:-1;;;;;;31755:23:0;;;31796:36;31770:7;;31762:16;-1:-1:-1;;;;;31796:36:0;;;;;31762:16;;31796:36;29820:110;;:::o;32237:625::-;32396:4;-1:-1:-1;;;;;32369:31:0;:23;32384:7;32369:14;:23::i;:::-;-1:-1:-1;;;;;32369:31:0;;32361:81;;;;-1:-1:-1;;;32361:81:0;;26614:2:1;32361:81:0;;;26596:21:1;26653:2;26633:18;;;26626:30;26692:34;26672:18;;;26665:62;-1:-1:-1;;;26743:18:1;;;26736:35;26788:19;;32361:81:0;26412:401:1;32361:81:0;-1:-1:-1;;;;;32461:16:0;;32453:65;;;;-1:-1:-1;;;32453:65:0;;27020:2:1;32453:65:0;;;27002:21:1;27059:2;27039:18;;;27032:30;27098:34;27078:18;;;27071:62;-1:-1:-1;;;27149:18:1;;;27142:34;27193:19;;32453:65:0;26818:400:1;32453:65:0;32635:29;32652:1;32656:7;32635:8;:29::i;:::-;-1:-1:-1;;;;;32677:15:0;;;;;;:9;:15;;;;;:20;;32696:1;;32677:15;:20;;32696:1;;32677:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32708:13:0;;;;;;:9;:13;;;;;:18;;32725:1;;32708:13;:18;;32725:1;;32708:18;:::i;:::-;;;;-1:-1:-1;;32737:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32737:21:0;-1:-1:-1;;;;;32737:21:0;;;;;;;;;32776:27;;32737:16;;32776:27;;;;;;;48310:237;;;:::o;32981:174::-;33056:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33056:29:0;-1:-1:-1;;;;;33056:29:0;;;;;;;;:24;;33110:23;33056:24;33110:14;:23::i;:::-;-1:-1:-1;;;;;33101:46:0;;;;;;;;;;;32981:174;;:::o;30157:319::-;30286:18;30292:2;30296:7;30286:5;:18::i;:::-;30337:53;30368:1;30372:2;30376:7;30385:4;30337:22;:53::i;:::-;30315:153;;;;-1:-1:-1;;;30315:153:0;;;;;;;:::i;29214:264::-;29307:4;29324:13;29340:23;29355:7;29340:14;:23::i;:::-;29324:39;;29393:5;-1:-1:-1;;;;;29382:16:0;:7;-1:-1:-1;;;;;29382:16:0;;:52;;;-1:-1:-1;;;;;;26317:25:0;;;26293:4;26317:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29402:32;29382:87;;;;29462:7;-1:-1:-1;;;;;29438:31:0;:20;29450:7;29438:11;:20::i;:::-;-1:-1:-1;;;;;29438:31:0;;29374:96;29214:264;-1:-1:-1;;;;29214:264:0:o;59909:190::-;60034:4;60087;60058:25;60071:5;60078:4;60058:12;:25::i;:::-;:33;;59909:190;-1:-1:-1;;;;59909:190:0:o;33298:315::-;33453:8;-1:-1:-1;;;;;33444:17:0;:5;-1:-1:-1;;;;;33444:17:0;;33436:55;;;;-1:-1:-1;;;33436:55:0;;27844:2:1;33436:55:0;;;27826:21:1;27883:2;27863:18;;;27856:30;27922:27;27902:18;;;27895:55;27967:18;;33436:55:0;27642:349:1;33436:55:0;-1:-1:-1;;;;;33502:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33502:46:0;;;;;;;;;;33564:41;;540::1;;;33564::0;;513:18:1;33564:41:0;;;;;;;33298:315;;;:::o;28294:313::-;28450:28;28460:4;28466:2;28470:7;28450:9;:28::i;:::-;28497:47;28520:4;28526:2;28530:7;28539:4;28497:22;:47::i;:::-;28489:110;;;;-1:-1:-1;;;28489:110:0;;;;;;;:::i;34401:853::-;34555:4;-1:-1:-1;;;;;34576:13:0;;10438:19;:23;34572:675;;34612:71;;-1:-1:-1;;;34612:71:0;;-1:-1:-1;;;;;34612:36:0;;;;;:71;;18222:10;;34663:4;;34669:7;;34678:4;;34612:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34612:71:0;;;;;;;;-1:-1:-1;;34612:71:0;;;;;;;;;;;;:::i;:::-;;;34608:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34853:6;:13;34870:1;34853:18;34849:328;;34896:60;;-1:-1:-1;;;34896:60:0;;;;;;;:::i;34849:328::-;35127:6;35121:13;35112:6;35108:2;35104:15;35097:38;34608:584;-1:-1:-1;;;;;;34734:51:0;-1:-1:-1;;;34734:51:0;;-1:-1:-1;34727:58:0;;34572:675;-1:-1:-1;35231:4:0;34401:853;;;;;;:::o;60107:675::-;60190:7;60233:4;60190:7;60248:497;60272:5;:12;60268:1;:16;60248:497;;;60306:20;60329:5;60335:1;60329:8;;;;;;;;:::i;:::-;;;;;;;60306:31;;60372:12;60356;:28;60352:382;;60858:13;60908:15;;;60944:4;60937:15;;;60991:4;60975:21;;60484:57;;60352:382;;;60858:13;60908:15;;;60944:4;60937:15;;;60991:4;60975:21;;60661:57;;60352:382;-1:-1:-1;60286:3:0;;;;:::i;:::-;;;;60248:497;;;-1:-1:-1;60762:12:0;60107:675;-1:-1:-1;;;60107:675:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;961:423::-;1003:3;1041:5;1035:12;1068:6;1063:3;1056:19;1093:1;1103:162;1117:6;1114:1;1111:13;1103:162;;;1179:4;1235:13;;;1231:22;;1225:29;1207:11;;;1203:20;;1196:59;1132:12;1103:162;;;1107:3;1310:1;1303:4;1294:6;1289:3;1285:16;1281:27;1274:38;1373:4;1366:2;1362:7;1357:2;1349:6;1345:15;1341:29;1336:3;1332:39;1328:50;1321:57;;;961:423;;;;:::o;1389:220::-;1538:2;1527:9;1520:21;1501:4;1558:45;1599:2;1588:9;1584:18;1576:6;1558:45;:::i;1614:180::-;1673:6;1726:2;1714:9;1705:7;1701:23;1697:32;1694:52;;;1742:1;1739;1732:12;1694:52;-1:-1:-1;1765:23:1;;1614:180;-1:-1:-1;1614:180:1:o;2189:254::-;2257:6;2265;2318:2;2306:9;2297:7;2293:23;2289:32;2286:52;;;2334:1;2331;2324:12;2286:52;2357:29;2376:9;2357:29;:::i;:::-;2347:39;2433:2;2418:18;;;;2405:32;;-1:-1:-1;;;2189:254:1:o;2630:367::-;2693:8;2703:6;2757:3;2750:4;2742:6;2738:17;2734:27;2724:55;;2775:1;2772;2765:12;2724:55;-1:-1:-1;2798:20:1;;2841:18;2830:30;;2827:50;;;2873:1;2870;2863:12;2827:50;2910:4;2902:6;2898:17;2886:29;;2970:3;2963:4;2953:6;2950:1;2946:14;2938:6;2934:27;2930:38;2927:47;2924:67;;;2987:1;2984;2977:12;2924:67;2630:367;;;;;:::o;3002:573::-;3106:6;3114;3122;3130;3183:2;3171:9;3162:7;3158:23;3154:32;3151:52;;;3199:1;3196;3189:12;3151:52;3239:9;3226:23;3272:18;3264:6;3261:30;3258:50;;;3304:1;3301;3294:12;3258:50;3343:70;3405:7;3396:6;3385:9;3381:22;3343:70;:::i;:::-;3432:8;;3317:96;;-1:-1:-1;3514:2:1;3499:18;;3486:32;;3565:2;3550:18;3537:32;;-1:-1:-1;3002:573:1;-1:-1:-1;;;;3002:573:1:o;3580:118::-;3666:5;3659:13;3652:21;3645:5;3642:32;3632:60;;3688:1;3685;3678:12;3703:309;3768:6;3776;3829:2;3817:9;3808:7;3804:23;3800:32;3797:52;;;3845:1;3842;3835:12;3797:52;3881:9;3868:23;3858:33;;3941:2;3930:9;3926:18;3913:32;3954:28;3976:5;3954:28;:::i;:::-;4001:5;3991:15;;;3703:309;;;;;:::o;4017:328::-;4094:6;4102;4110;4163:2;4151:9;4142:7;4138:23;4134:32;4131:52;;;4179:1;4176;4169:12;4131:52;4202:29;4221:9;4202:29;:::i;:::-;4192:39;;4250:38;4284:2;4273:9;4269:18;4250:38;:::i;:::-;4240:48;;4335:2;4324:9;4320:18;4307:32;4297:42;;4017:328;;;;;:::o;4573:127::-;4634:10;4629:3;4625:20;4622:1;4615:31;4665:4;4662:1;4655:15;4689:4;4686:1;4679:15;4705:275;4776:2;4770:9;4841:2;4822:13;;-1:-1:-1;;4818:27:1;4806:40;;4876:18;4861:34;;4897:22;;;4858:62;4855:88;;;4923:18;;:::i;:::-;4959:2;4952:22;4705:275;;-1:-1:-1;4705:275:1:o;4985:712::-;5039:5;5092:3;5085:4;5077:6;5073:17;5069:27;5059:55;;5110:1;5107;5100:12;5059:55;5146:6;5133:20;5172:4;5195:18;5191:2;5188:26;5185:52;;;5217:18;;:::i;:::-;5263:2;5260:1;5256:10;5286:28;5310:2;5306;5302:11;5286:28;:::i;:::-;5348:15;;;5418;;;5414:24;;;5379:12;;;;5450:15;;;5447:35;;;5478:1;5475;5468:12;5447:35;5514:2;5506:6;5502:15;5491:26;;5526:142;5542:6;5537:3;5534:15;5526:142;;;5608:17;;5596:30;;5559:12;;;;5646;;;;5526:142;;;5686:5;4985:712;-1:-1:-1;;;;;;;4985:712:1:o;5702:416::-;5795:6;5803;5856:2;5844:9;5835:7;5831:23;5827:32;5824:52;;;5872:1;5869;5862:12;5824:52;5912:9;5899:23;5945:18;5937:6;5934:30;5931:50;;;5977:1;5974;5967:12;5931:50;6000:61;6053:7;6044:6;6033:9;6029:22;6000:61;:::i;:::-;5990:71;6108:2;6093:18;;;;6080:32;;-1:-1:-1;;;;5702:416:1:o;6123:377::-;6197:6;6205;6213;6266:2;6254:9;6245:7;6241:23;6237:32;6234:52;;;6282:1;6279;6272:12;6234:52;6318:9;6305:23;6295:33;;6375:2;6364:9;6360:18;6347:32;6337:42;;6429:2;6418:9;6414:18;6401:32;6442:28;6464:5;6442:28;:::i;:::-;6489:5;6479:15;;;6123:377;;;;;:::o;6745:407::-;6810:5;6844:18;6836:6;6833:30;6830:56;;;6866:18;;:::i;:::-;6904:57;6949:2;6928:15;;-1:-1:-1;;6924:29:1;6955:4;6920:40;6904:57;:::i;:::-;6895:66;;6984:6;6977:5;6970:21;7024:3;7015:6;7010:3;7006:16;7003:25;7000:45;;;7041:1;7038;7031:12;7000:45;7090:6;7085:3;7078:4;7071:5;7067:16;7054:43;7144:1;7137:4;7128:6;7121:5;7117:18;7113:29;7106:40;6745:407;;;;;:::o;7157:451::-;7226:6;7279:2;7267:9;7258:7;7254:23;7250:32;7247:52;;;7295:1;7292;7285:12;7247:52;7335:9;7322:23;7368:18;7360:6;7357:30;7354:50;;;7400:1;7397;7390:12;7354:50;7423:22;;7476:4;7468:13;;7464:27;-1:-1:-1;7454:55:1;;7505:1;7502;7495:12;7454:55;7528:74;7594:7;7589:2;7576:16;7571:2;7567;7563:11;7528:74;:::i;7613:648::-;7726:6;7734;7742;7750;7758;7811:3;7799:9;7790:7;7786:23;7782:33;7779:53;;;7828:1;7825;7818:12;7779:53;7851:29;7870:9;7851:29;:::i;:::-;7841:39;;7931:2;7920:9;7916:18;7903:32;7958:18;7950:6;7947:30;7944:50;;;7990:1;7987;7980:12;7944:50;8029:70;8091:7;8082:6;8071:9;8067:22;8029:70;:::i;:::-;7613:648;;8118:8;;-1:-1:-1;8003:96:1;;8200:2;8185:18;;8172:32;;8251:2;8236:18;;;8223:32;;-1:-1:-1;7613:648:1;-1:-1:-1;;;;7613:648:1:o;8519:315::-;8584:6;8592;8645:2;8633:9;8624:7;8620:23;8616:32;8613:52;;;8661:1;8658;8651:12;8613:52;8684:29;8703:9;8684:29;:::i;:::-;8674:39;;8763:2;8752:9;8748:18;8735:32;8776:28;8798:5;8776:28;:::i;8839:316::-;8916:6;8924;8932;8985:2;8973:9;8964:7;8960:23;8956:32;8953:52;;;9001:1;8998;8991:12;8953:52;-1:-1:-1;;9024:23:1;;;9094:2;9079:18;;9066:32;;-1:-1:-1;9145:2:1;9130:18;;;9117:32;;8839:316;-1:-1:-1;8839:316:1:o;9160:667::-;9255:6;9263;9271;9279;9332:3;9320:9;9311:7;9307:23;9303:33;9300:53;;;9349:1;9346;9339:12;9300:53;9372:29;9391:9;9372:29;:::i;:::-;9362:39;;9420:38;9454:2;9443:9;9439:18;9420:38;:::i;:::-;9410:48;;9505:2;9494:9;9490:18;9477:32;9467:42;;9560:2;9549:9;9545:18;9532:32;9587:18;9579:6;9576:30;9573:50;;;9619:1;9616;9609:12;9573:50;9642:22;;9695:4;9687:13;;9683:27;-1:-1:-1;9673:55:1;;9724:1;9721;9714:12;9673:55;9747:74;9813:7;9808:2;9795:16;9790:2;9786;9782:11;9747:74;:::i;:::-;9737:84;;;9160:667;;;;;;;:::o;9832:477::-;9922:6;9930;9983:2;9971:9;9962:7;9958:23;9954:32;9951:52;;;9999:1;9996;9989:12;9951:52;10039:9;10026:23;10072:18;10064:6;10061:30;10058:50;;;10104:1;10101;10094:12;10058:50;10127:61;10180:7;10171:6;10160:9;10156:22;10127:61;:::i;:::-;10117:71;;;10238:2;10227:9;10223:18;10210:32;10251:28;10273:5;10251:28;:::i;10314:260::-;10382:6;10390;10443:2;10431:9;10422:7;10418:23;10414:32;10411:52;;;10459:1;10456;10449:12;10411:52;10482:29;10501:9;10482:29;:::i;:::-;10472:39;;10530:38;10564:2;10553:9;10549:18;10530:38;:::i;:::-;10520:48;;10314:260;;;;;:::o;10579:380::-;10658:1;10654:12;;;;10701;;;10722:61;;10776:4;10768:6;10764:17;10754:27;;10722:61;10829:2;10821:6;10818:14;10798:18;10795:38;10792:161;;10875:10;10870:3;10866:20;10863:1;10856:31;10910:4;10907:1;10900:15;10938:4;10935:1;10928:15;10792:161;;10579:380;;;:::o;10964:352::-;11166:2;11148:21;;;11205:2;11185:18;;;11178:30;11244;11239:2;11224:18;;11217:58;11307:2;11292:18;;10964:352::o;11321:356::-;11523:2;11505:21;;;11542:18;;;11535:30;11601:34;11596:2;11581:18;;11574:62;11668:2;11653:18;;11321:356::o;12705:127::-;12766:10;12761:3;12757:20;12754:1;12747:31;12797:4;12794:1;12787:15;12821:4;12818:1;12811:15;12837:125;12902:9;;;12923:10;;;12920:36;;;12936:18;;:::i;12967:337::-;13169:2;13151:21;;;13208:2;13188:18;;;13181:30;-1:-1:-1;;;13242:2:1;13227:18;;13220:43;13295:2;13280:18;;12967:337::o;13644:135::-;13683:3;13704:17;;;13701:43;;13724:18;;:::i;:::-;-1:-1:-1;13771:1:1;13760:13;;13644:135::o;13784:128::-;13851:9;;;13872:11;;;13869:37;;;13886:18;;:::i;14696:345::-;14898:2;14880:21;;;14937:2;14917:18;;;14910:30;-1:-1:-1;;;14971:2:1;14956:18;;14949:51;15032:2;15017:18;;14696:345::o;16727:435::-;16780:3;16818:5;16812:12;16845:6;16840:3;16833:19;16871:4;16900:2;16895:3;16891:12;16884:19;;16937:2;16930:5;16926:14;16958:1;16968:169;16982:6;16979:1;16976:13;16968:169;;;17043:13;;17031:26;;17077:12;;;;17112:15;;;;17004:1;16997:9;16968:169;;;-1:-1:-1;17153:3:1;;16727:435;-1:-1:-1;;;;;16727:435:1:o;17167:502::-;17430:3;17419:9;17412:22;17393:4;17451:57;17503:3;17492:9;17488:19;17480:6;17451:57;:::i;:::-;-1:-1:-1;;;;;17544:32:1;;;;17539:2;17524:18;;17517:60;-1:-1:-1;17608:2:1;17593:18;;17586:34;;;;17651:2;17636:18;;;17629:34;17443:65;17167:502;-1:-1:-1;17167:502:1:o;17800:545::-;17902:2;17897:3;17894:11;17891:448;;;17938:1;17963:5;17959:2;17952:17;18008:4;18004:2;17994:19;18078:2;18066:10;18062:19;18059:1;18055:27;18049:4;18045:38;18114:4;18102:10;18099:20;18096:47;;;-1:-1:-1;18137:4:1;18096:47;18192:2;18187:3;18183:12;18180:1;18176:20;18170:4;18166:31;18156:41;;18247:82;18265:2;18258:5;18255:13;18247:82;;;18310:17;;;18291:1;18280:13;18247:82;;;18251:3;;;17800:545;;;:::o;18521:1352::-;18647:3;18641:10;18674:18;18666:6;18663:30;18660:56;;;18696:18;;:::i;:::-;18725:97;18815:6;18775:38;18807:4;18801:11;18775:38;:::i;:::-;18769:4;18725:97;:::i;:::-;18877:4;;18941:2;18930:14;;18958:1;18953:663;;;;19660:1;19677:6;19674:89;;;-1:-1:-1;19729:19:1;;;19723:26;19674:89;-1:-1:-1;;18478:1:1;18474:11;;;18470:24;18466:29;18456:40;18502:1;18498:11;;;18453:57;19776:81;;18923:944;;18953:663;17747:1;17740:14;;;17784:4;17771:18;;-1:-1:-1;;18989:20:1;;;19107:236;19121:7;19118:1;19115:14;19107:236;;;19210:19;;;19204:26;19189:42;;19302:27;;;;19270:1;19258:14;;;;19137:19;;19107:236;;;19111:3;19371:6;19362:7;19359:19;19356:201;;;19432:19;;;19426:26;-1:-1:-1;;19515:1:1;19511:14;;;19527:3;19507:24;19503:37;19499:42;19484:58;19469:74;;19356:201;-1:-1:-1;;;;;19603:1:1;19587:14;;;19583:22;19570:36;;-1:-1:-1;18521:1352:1:o;19878:963::-;19987:4;20016:2;20045;20034:9;20027:21;20068:1;20101:6;20095:13;20131:36;20157:9;20131:36;:::i;:::-;20203:6;20198:2;20187:9;20183:18;20176:34;20229:2;20250:1;20282:2;20271:9;20267:18;20299:1;20294:158;;;;20466:1;20461:354;;;;20260:555;;20294:158;-1:-1:-1;;20342:24:1;;20322:18;;;20315:52;20420:14;;20413:22;20410:1;20406:30;20391:46;;20387:55;;;-1:-1:-1;20294:158:1;;20461:354;20492:6;20489:1;20482:17;20540:2;20537:1;20527:16;20565:1;20579:180;20593:6;20590:1;20587:13;20579:180;;;20686:14;;20662:17;;;20658:26;;20651:50;20729:16;;;;20608:10;;20579:180;;;20783:17;;20779:26;;;-1:-1:-1;;20260:555:1;-1:-1:-1;20832:3:1;;19878:963;-1:-1:-1;;;;;;;;19878:963:1:o;22245:127::-;22306:10;22301:3;22297:20;22294:1;22287:31;22337:4;22334:1;22327:15;22361:4;22358:1;22351:15;22377:342;22578:2;22567:9;22560:21;22541:4;22598:56;22650:2;22639:9;22635:18;22627:6;22598:56;:::i;:::-;22590:64;;22704:6;22697:14;22690:22;22685:2;22674:9;22670:18;22663:50;22377:342;;;;;:::o;24196:245::-;24263:6;24316:2;24304:9;24295:7;24291:23;24287:32;24284:52;;;24332:1;24329;24322:12;24284:52;24364:9;24358:16;24383:28;24405:5;24383:28;:::i;25279:410::-;25481:2;25463:21;;;25520:2;25500:18;;;25493:30;25559:34;25554:2;25539:18;;25532:62;-1:-1:-1;;;25625:2:1;25610:18;;25603:44;25679:3;25664:19;;25279:410::o;27223:414::-;27425:2;27407:21;;;27464:2;27444:18;;;27437:30;27503:34;27498:2;27483:18;;27476:62;-1:-1:-1;;;27569:2:1;27554:18;;27547:48;27627:3;27612:19;;27223:414::o;27996:489::-;-1:-1:-1;;;;;28265:15:1;;;28247:34;;28317:15;;28312:2;28297:18;;28290:43;28364:2;28349:18;;28342:34;;;28412:3;28407:2;28392:18;;28385:31;;;28190:4;;28433:46;;28459:19;;28451:6;28433:46;:::i;28490:249::-;28559:6;28612:2;28600:9;28591:7;28587:23;28583:32;28580:52;;;28628:1;28625;28618:12;28580:52;28660:9;28654:16;28679:30;28703:5;28679:30;:::i
Swarm Source
ipfs://177c28e12de771427009f1b4d2fc0d209f81eb67a66572fa3a217519f33906fd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.