ERC-721
Overview
Max Total Supply
0 BGP
Holders
979
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 BGPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
bitsCrunchGenesisPass
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title bitsCrunch Genesis Pass /// @author Andre Costa @ LuxLabs.io // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ 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 = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // 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); } // OpenZeppelin Contracts v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // 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); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address internal _oldOwner; uint256 internal lastOwnershipTransfer; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the previous owner. */ function oldOwner() public view virtual returns (address) { return _oldOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner_ = _owner; _oldOwner = oldOwner_; _owner = newOwner; lastOwnershipTransfer = block.timestamp; emit OwnershipTransferred(oldOwner_, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(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 or 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 or 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 or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @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. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } contract bitsCrunchGenesisPass is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 2000; /// @notice Total reserved uint256 public reserved = 200; uint256 public reservedMinted; /// @notice Total guaranteed mint count uint256 public guaranteed; /// @dev Merkle tree root hash for guaranteed list bytes32 public rootForGuaranteed; /// @dev Merkle tree root hash for allowed list bytes32 public rootForOversubscribed; /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints mapping(address => bool) public mintedOnGuaranteed; mapping(address => bool) public mintedOnOversubscribed; /// @dev Counters library to track token id and counts using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; Counters.Counter private _guaranteedAllowListMintedCounter; Counters.Counter private _oversubscribedAllowListMintedCounter; /// @dev Different states of minting enum MintState { PAUSED, // Minting is paused GUARANTEED, // Guaranteed allow list OVERSUBSCRIBED, // General allow list PUBLIC // Open to public } MintState public mintState = MintState.PAUSED; constructor() ERC721("bitsCrunch Genesis Pass", "BGP") { // baseURI = "ipfs:///"; } /// Base uri functions ///@notice Returns the base uri ///@return Base uri function _baseURI() internal view override returns (string memory) { return baseURI; } ///@notice Sets a new base uri ///@dev Only callable by owner ///@param newBaseURI The new base uri function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } ///@notice Returns the token uri ///@dev Updated to include json ///@param tokenId Token id function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : ""; } /// Minting functions ///@notice Mints nft token for allowed list addresses ///@dev Uses Merkle tree proof ///@param proof The Merkle tree proof of the allow list address function mintAllowlist(bytes32[] calldata proof) external { /// Check if the sale is paused require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states"); require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); /// Check if user is on the allow list bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); /// Update the root based on the state bytes32 root; // If current state is for guaranteed mints, set to the guaranteed hash if (mintState == MintState.GUARANTEED) { /// Set the correct root hash root = rootForGuaranteed; /// Check that user has not minted on guaranteed list require(mintedOnGuaranteed[_msgSender()] == false, "User already minted on guaranteed list"); // Check there is sufficient guaranteed mint supply left require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); /// Increase the allow list minted count _guaranteedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnGuaranteed[_msgSender()] = true; } // If current state is for oversubscribed, set to the oversubscribed hash if (mintState == MintState.OVERSUBSCRIBED) { /// Set the correct root hash root = rootForOversubscribed; /// Check that user has not minted on oversubscribed list require(mintedOnOversubscribed[_msgSender()] == false, "User already minted on oversubscribed list"); /// Check there is sufficient oversubscribed supply left /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); _oversubscribedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnOversubscribed[_msgSender()] = true; } // Check the merkle proof require(MerkleProof.verify(proof, root, leaf), "Invalid proof"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mints a token to caller addresses function mintPublic() external { require(mintState == MintState.PUBLIC, "Public mint inactive"); /// Check balance of supply /// Total supply minus reserved require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mint from reserve supply ///@dev Only callable by owner ///@param to Array of addresses to receive airdrop function mintFromReserved(address to, uint256 amount) external onlyOwner { /// Check balance of supply require(amount + reservedMinted <= reserved, "Amount exceeds reserved supply"); for(uint i; i < amount;) { /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(to, tokenId); /// Unchecked i to save gas unchecked { i++; } } reservedMinted += amount; } /// Other view and admin functions /** * @param merkleRoot_ The new merkle root */ function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner { rootForGuaranteed = merkleRoot_; } /** * @param merkleRoot_ The new merkle root */ function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner { rootForOversubscribed = merkleRoot_; } ///@notice Returns the total number of nftes minted function totalMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _tokenIdCounter.current(); } ///@notice Returns the current number of guaranteed allow list minted function totalGuaranteedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current(); } ///@notice Returns the current number of oversubscribed allow list minted function totalOversubscribedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _oversubscribedAllowListMintedCounter.current(); } ///@notice Returns the total allow list minted function totalAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); } /** * Set mint state. * @param mintState_ The new state of the contract. */ function setMintState(uint256 mintState_) external onlyOwner { require(mintState_ < 5, "Invalid State!"); if (mintState_ == 0) { mintState = MintState.PAUSED; } else if (mintState_ == 1) { mintState = MintState.GUARANTEED; } else if (mintState_ == 2) { mintState = MintState.OVERSUBSCRIBED; } else { mintState = MintState.PUBLIC; } } ///@notice Function to update guaranteed mint count ///@param count New guaranteed mint count function setGuaranteedCount(uint256 count) external onlyOwner { guaranteed = count; } ///@notice Function to update reserved mint count ///@param count New reserved mint count function setReservedCount(uint256 count) external onlyOwner { reserved = count; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum bitsCrunchGenesisPass.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","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"}]
Contract Creation Code
60806040526107d0600a5560c8600b556015805460ff191690553480156200002657600080fd5b506040518060400160405280601781526020017f626974734372756e63682047656e6573697320506173730000000000000000008152506040518060400160405280600381526020016204247560ec1b81525081600090816200008a9190620001c7565b506001620000998282620001c7565b505050620000b6620000b0620000bc60201b60201c565b620000c0565b62000293565b3390565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014d57607f821691505b6020821081036200016e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001c257600081815260208120601f850160051c810160208610156200019d5750805b601f850160051c820191505b81811015620001be57828155600101620001a9565b5050505b505050565b81516001600160401b03811115620001e357620001e362000122565b620001fb81620001f4845462000138565b8462000174565b602080601f8311600181146200023357600084156200021a5750858301515b600019600386901b1c1916600185901b178555620001be565b600085815260208120601f198616915b82811015620002645788860151825594840194600190910190840162000243565b5085821015620002835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61240680620002a36000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146104cb578063f2fde38b146104d3578063f487404f146104e6578063f9c957d8146104f7578063fe60d12c1461050a57600080fd5b8063c87b56dd1461048b578063d371f76b1461049e578063d5abeb01146104a6578063e921dad2146104af578063e985e9c5146104b857600080fd5b8063a2309ff8116100ff578063a2309ff814610420578063ad8c3f3314610428578063b24222321461043b578063b88d4fde1461045e578063c051e38a1461047157600080fd5b8063893807aa146103c95780638c874ebd146103ec5780638da5cb5b146103f457806395d89b4114610405578063a22cb4651461040d57600080fd5b806335d5959a116101c95780636352211e1161018d5780636352211e146103805780636c0360eb146103935780636c96b0831461039b57806370a08231146103ae578063715018a6146103c157600080fd5b806335d5959a146103365780633c1860181461034957806342842e0e146103515780634f297ccc1461036457806355f804b31461036d57600080fd5b80630bb862d1116102105780630bb862d1146102dd57806316f9b707146102f057806323b872dd146103035780632dc7b8551461031657806332f4681c1461032d57600080fd5b806301ffc9a71461024d57806306fdde0314610275578063081812fc1461028a578063084520b4146102b5578063095ea7b3146102ca575b600080fd5b61026061025b366004611c25565b610513565b60405190151581526020015b60405180910390f35b61027d610565565b60405161026c9190611c99565b61029d610298366004611cac565b6105f7565b6040516001600160a01b03909116815260200161026c565b6102c86102c3366004611ce1565b61061e565b005b6102c86102d8366004611ce1565b610704565b6102c86102eb366004611cac565b610819565b6102c86102fe366004611cac565b6108ec565b6102c8610311366004611d0b565b61091b565b61031f600e5481565b60405190815260200161026c565b61031f600d5481565b6102c8610344366004611cac565b61094c565b61031f61097b565b6102c861035f366004611d0b565b610998565b61031f600c5481565b6102c861037b366004611dd3565b6109b3565b61029d61038e366004611cac565b6109ed565b61027d610a4d565b6102c86103a9366004611e1c565b610adb565b61031f6103bc366004611e91565b610ed1565b6102c8610f57565b6102606103d7366004611e91565b60116020526000908152604090205460ff1681565b6102c8610f8d565b6006546001600160a01b031661029d565b61027d611079565b6102c861041b366004611eac565b611088565b61031f611093565b6102c8610436366004611cac565b61109e565b610260610449366004611e91565b60106020526000908152604090205460ff1681565b6102c861046c366004611ee8565b6110cd565b60155461047e9060ff1681565b60405161026c9190611f7a565b61027d610499366004611cac565b611105565b61031f6111bb565b61031f600a5481565b61031f600f5481565b6102606104c6366004611fa2565b6111c6565b61031f6111f4565b6102c86104e1366004611e91565b6111ff565b6007546001600160a01b031661029d565b6102c8610505366004611cac565b611297565b61031f600b5481565b60006001600160e01b031982166380ac58cd60e01b148061054457506001600160e01b03198216635b5e139f60e01b145b8061055f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461057490611fd5565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090611fd5565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000610602826112c6565b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b031633146106515760405162461bcd60e51b81526004016106489061200f565b60405180910390fd5b600b54600c54610661908361205a565b11156106af5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c7900006044820152606401610648565b60005b818110156106e85760006106c560125490565b90506106d5601280546001019055565b6106df8482611325565b506001016106b2565b5080600c60008282546106fb919061205a565b90915550505050565b600061070f826109ed565b9050806001600160a01b0316836001600160a01b03160361077c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610648565b336001600160a01b0382161480610798575061079881336111c6565b61080a5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610648565b610814838361133f565b505050565b6006546001600160a01b031633146108435760405162461bcd60e51b81526004016106489061200f565b600581106108845760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b6044820152606401610648565b806000036108a457601580546000919060ff19166001835b021790555050565b806001036108bf57601580546001919060ff1916828061089c565b806002036108db57601580546002919060ff191660018361089c565b6015805460ff191660031790555b50565b6006546001600160a01b031633146109165760405162461bcd60e51b81526004016106489061200f565b600b55565b61092533826113ad565b6109415760405162461bcd60e51b81526004016106489061206d565b610814838383611484565b6006546001600160a01b031633146109765760405162461bcd60e51b81526004016106489061200f565b600e55565b600061098660145490565b601354610993919061205a565b905090565b610814838383604051806020016040528060008152506110cd565b6006546001600160a01b031633146109dd5760405162461bcd60e51b81526004016106489061200f565b60096109e98282612108565b5050565b6000818152600260205260408120546001600160a01b03168061055f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610648565b60098054610a5a90611fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690611fd5565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b505050505081565b600160155460ff166003811115610af457610af4611f64565b1480610b165750600260155460ff166003811115610b1457610b14611f64565b145b610b625760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573006044820152606401610648565b600a5460125410610ba95760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610648565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000600160155460ff166003811115610bff57610bff611f64565b03610cf85750600e543360009081526010602052604090205460ff1615610c775760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b6064820152608401610648565b600d54610c826111f4565b10610ccf5760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e746564000000006044820152606401610648565b610cdd601380546001019055565b336000908152601060205260409020805460ff191660011790555b600260155460ff166003811115610d1157610d11611f64565b03610e285750600f543360009081526011602052604090205460ff1615610d8d5760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b6064820152608401610648565b600d54600b54600a54610da091906121c8565b610daa91906121c8565b610db26111bb565b10610dff5760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000006044820152606401610648565b610e0d601480546001019055565b336000908152601160205260409020805460ff191660011790555b610e6884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525085925086915061162a9050565b610ea45760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610648565b6000610eaf60125490565b9050610ebf601280546001019055565b610eca335b82611325565b5050505050565b60006001600160a01b038216610f3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610648565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f815760405162461bcd60e51b81526004016106489061200f565b610f8b6000611640565b565b600360155460ff166003811115610fa657610fa6611f64565b14610fea5760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b6044820152606401610648565b600b54600a54610ffa91906121c8565b601254106110555760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b6064820152608401610648565b600061106060125490565b9050611070601280546001019055565b6108e933610ec4565b60606001805461057490611fd5565b6109e93383836116a2565b600061099360125490565b6006546001600160a01b031633146110c85760405162461bcd60e51b81526004016106489061200f565b600f55565b6110d733836113ad565b6110f35760405162461bcd60e51b81526004016106489061206d565b6110ff84848484611770565b50505050565b606061111060125490565b82111561115f5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610648565b60006009805461116e90611fd5565b90501161118a576040518060200160405280600081525061055f565b6009611195836117a3565b6040516020016111a69291906121db565b60405160208183030381529060405292915050565b600061099360145490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061099360135490565b6006546001600160a01b031633146112295760405162461bcd60e51b81526004016106489061200f565b6001600160a01b03811661128e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610648565b6108e981611640565b6006546001600160a01b031633146112c15760405162461bcd60e51b81526004016106489061200f565b600d55565b6000818152600260205260409020546001600160a01b03166108e95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610648565b6109e98282604051806020016040528060008152506118a4565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611374826109ed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610648565b6000611431836109ed565b9050806001600160a01b0316846001600160a01b03161480611458575061145881856111c6565b8061147c5750836001600160a01b0316611471846105f7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611497826109ed565b6001600160a01b0316146114bd5760405162461bcd60e51b815260040161064890612272565b6001600160a01b03821661151f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610648565b826001600160a01b0316611532826109ed565b6001600160a01b0316146115585760405162461bcd60e51b815260040161064890612272565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b03861683526003909152812080546001929061159b9084906121c8565b90915550506001600160a01b03821660009081526003602052604081208054600192906115c990849061205a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008261163785846118d7565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036117035760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610648565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61177b848484611484565b61178784848484611983565b6110ff5760405162461bcd60e51b8152600401610648906122b7565b6060816000036117ca5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117f457806117de81612309565b91506117ed9050600a83612338565b91506117ce565b60008167ffffffffffffffff81111561180f5761180f611d47565b6040519080825280601f01601f191660200182016040528015611839576020820181803683370190505b5090505b841561147c5761184e6001836121c8565b915061185b600a8661234c565b61186690603061205a565b60f81b81838151811061187b5761187b612360565b60200101906001600160f81b031916908160001a90535061189d600a86612338565b945061183d565b6118ae8383611a84565b6118bb6000848484611983565b6108145760405162461bcd60e51b8152600401610648906122b7565b600081815b845181101561197b5760008582815181106118f9576118f9612360565b6020026020010151905080831161193b576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611968565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061197381612309565b9150506118dc565b509392505050565b60006001600160a01b0384163b15611a7957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119c7903390899088908890600401612376565b6020604051808303816000875af1925050508015611a02575060408051601f3d908101601f191682019092526119ff918101906123b3565b60015b611a5f573d808015611a30576040519150601f19603f3d011682016040523d82523d6000602084013e611a35565b606091505b508051600003611a575760405162461bcd60e51b8152600401610648906122b7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147c565b506001949350505050565b6001600160a01b038216611ada5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610648565b6000818152600260205260409020546001600160a01b031615611b3f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610648565b6000818152600260205260409020546001600160a01b031615611ba45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610648565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146108e957600080fd5b600060208284031215611c3757600080fd5b8135611c4281611c0f565b9392505050565b60005b83811015611c64578181015183820152602001611c4c565b50506000910152565b60008151808452611c85816020860160208601611c49565b601f01601f19169290920160200192915050565b602081526000611c426020830184611c6d565b600060208284031215611cbe57600080fd5b5035919050565b80356001600160a01b0381168114611cdc57600080fd5b919050565b60008060408385031215611cf457600080fd5b611cfd83611cc5565b946020939093013593505050565b600080600060608486031215611d2057600080fd5b611d2984611cc5565b9250611d3760208501611cc5565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d7857611d78611d47565b604051601f8501601f19908116603f01168101908282118183101715611da057611da0611d47565b81604052809350858152868686011115611db957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611de557600080fd5b813567ffffffffffffffff811115611dfc57600080fd5b8201601f81018413611e0d57600080fd5b61147c84823560208401611d5d565b60008060208385031215611e2f57600080fd5b823567ffffffffffffffff80821115611e4757600080fd5b818501915085601f830112611e5b57600080fd5b813581811115611e6a57600080fd5b8660208260051b8501011115611e7f57600080fd5b60209290920196919550909350505050565b600060208284031215611ea357600080fd5b611c4282611cc5565b60008060408385031215611ebf57600080fd5b611ec883611cc5565b915060208301358015158114611edd57600080fd5b809150509250929050565b60008060008060808587031215611efe57600080fd5b611f0785611cc5565b9350611f1560208601611cc5565b925060408501359150606085013567ffffffffffffffff811115611f3857600080fd5b8501601f81018713611f4957600080fd5b611f5887823560208401611d5d565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611f9c57634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611fb557600080fd5b611fbe83611cc5565b9150611fcc60208401611cc5565b90509250929050565b600181811c90821680611fe957607f821691505b60208210810361200957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561055f5761055f612044565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f82111561081457600081815260208120601f850160051c810160208610156120e15750805b601f850160051c820191505b81811015612100578281556001016120ed565b505050505050565b815167ffffffffffffffff81111561212257612122611d47565b612136816121308454611fd5565b846120ba565b602080601f83116001811461216b57600084156121535750858301515b600019600386901b1c1916600185901b178555612100565b600085815260208120601f198616915b8281101561219a5788860151825594840194600190910190840161217b565b50858210156121b85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561055f5761055f612044565b60008084546121e981611fd5565b60018281168015612201576001811461221657612245565b60ff1984168752821515830287019450612245565b8860005260208060002060005b8581101561223c5781548a820152908401908201612223565b50505082870194505b505050508351612259818360208801611c49565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161231b5761231b612044565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261234757612347612322565b500490565b60008261235b5761235b612322565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123a990830184611c6d565b9695505050505050565b6000602082840312156123c557600080fd5b8151611c4281611c0f56fea26469706673582212200a50179a002a147fad638665b7b0e7e0cb963d27cd44cd1fe56f0fa3f6802b4e64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063893807aa1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146104cb578063f2fde38b146104d3578063f487404f146104e6578063f9c957d8146104f7578063fe60d12c1461050a57600080fd5b8063c87b56dd1461048b578063d371f76b1461049e578063d5abeb01146104a6578063e921dad2146104af578063e985e9c5146104b857600080fd5b8063a2309ff8116100ff578063a2309ff814610420578063ad8c3f3314610428578063b24222321461043b578063b88d4fde1461045e578063c051e38a1461047157600080fd5b8063893807aa146103c95780638c874ebd146103ec5780638da5cb5b146103f457806395d89b4114610405578063a22cb4651461040d57600080fd5b806335d5959a116101c95780636352211e1161018d5780636352211e146103805780636c0360eb146103935780636c96b0831461039b57806370a08231146103ae578063715018a6146103c157600080fd5b806335d5959a146103365780633c1860181461034957806342842e0e146103515780634f297ccc1461036457806355f804b31461036d57600080fd5b80630bb862d1116102105780630bb862d1146102dd57806316f9b707146102f057806323b872dd146103035780632dc7b8551461031657806332f4681c1461032d57600080fd5b806301ffc9a71461024d57806306fdde0314610275578063081812fc1461028a578063084520b4146102b5578063095ea7b3146102ca575b600080fd5b61026061025b366004611c25565b610513565b60405190151581526020015b60405180910390f35b61027d610565565b60405161026c9190611c99565b61029d610298366004611cac565b6105f7565b6040516001600160a01b03909116815260200161026c565b6102c86102c3366004611ce1565b61061e565b005b6102c86102d8366004611ce1565b610704565b6102c86102eb366004611cac565b610819565b6102c86102fe366004611cac565b6108ec565b6102c8610311366004611d0b565b61091b565b61031f600e5481565b60405190815260200161026c565b61031f600d5481565b6102c8610344366004611cac565b61094c565b61031f61097b565b6102c861035f366004611d0b565b610998565b61031f600c5481565b6102c861037b366004611dd3565b6109b3565b61029d61038e366004611cac565b6109ed565b61027d610a4d565b6102c86103a9366004611e1c565b610adb565b61031f6103bc366004611e91565b610ed1565b6102c8610f57565b6102606103d7366004611e91565b60116020526000908152604090205460ff1681565b6102c8610f8d565b6006546001600160a01b031661029d565b61027d611079565b6102c861041b366004611eac565b611088565b61031f611093565b6102c8610436366004611cac565b61109e565b610260610449366004611e91565b60106020526000908152604090205460ff1681565b6102c861046c366004611ee8565b6110cd565b60155461047e9060ff1681565b60405161026c9190611f7a565b61027d610499366004611cac565b611105565b61031f6111bb565b61031f600a5481565b61031f600f5481565b6102606104c6366004611fa2565b6111c6565b61031f6111f4565b6102c86104e1366004611e91565b6111ff565b6007546001600160a01b031661029d565b6102c8610505366004611cac565b611297565b61031f600b5481565b60006001600160e01b031982166380ac58cd60e01b148061054457506001600160e01b03198216635b5e139f60e01b145b8061055f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461057490611fd5565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090611fd5565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000610602826112c6565b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b031633146106515760405162461bcd60e51b81526004016106489061200f565b60405180910390fd5b600b54600c54610661908361205a565b11156106af5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c7900006044820152606401610648565b60005b818110156106e85760006106c560125490565b90506106d5601280546001019055565b6106df8482611325565b506001016106b2565b5080600c60008282546106fb919061205a565b90915550505050565b600061070f826109ed565b9050806001600160a01b0316836001600160a01b03160361077c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610648565b336001600160a01b0382161480610798575061079881336111c6565b61080a5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610648565b610814838361133f565b505050565b6006546001600160a01b031633146108435760405162461bcd60e51b81526004016106489061200f565b600581106108845760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b6044820152606401610648565b806000036108a457601580546000919060ff19166001835b021790555050565b806001036108bf57601580546001919060ff1916828061089c565b806002036108db57601580546002919060ff191660018361089c565b6015805460ff191660031790555b50565b6006546001600160a01b031633146109165760405162461bcd60e51b81526004016106489061200f565b600b55565b61092533826113ad565b6109415760405162461bcd60e51b81526004016106489061206d565b610814838383611484565b6006546001600160a01b031633146109765760405162461bcd60e51b81526004016106489061200f565b600e55565b600061098660145490565b601354610993919061205a565b905090565b610814838383604051806020016040528060008152506110cd565b6006546001600160a01b031633146109dd5760405162461bcd60e51b81526004016106489061200f565b60096109e98282612108565b5050565b6000818152600260205260408120546001600160a01b03168061055f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610648565b60098054610a5a90611fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690611fd5565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b505050505081565b600160155460ff166003811115610af457610af4611f64565b1480610b165750600260155460ff166003811115610b1457610b14611f64565b145b610b625760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573006044820152606401610648565b600a5460125410610ba95760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610648565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000600160155460ff166003811115610bff57610bff611f64565b03610cf85750600e543360009081526010602052604090205460ff1615610c775760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b6064820152608401610648565b600d54610c826111f4565b10610ccf5760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e746564000000006044820152606401610648565b610cdd601380546001019055565b336000908152601060205260409020805460ff191660011790555b600260155460ff166003811115610d1157610d11611f64565b03610e285750600f543360009081526011602052604090205460ff1615610d8d5760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b6064820152608401610648565b600d54600b54600a54610da091906121c8565b610daa91906121c8565b610db26111bb565b10610dff5760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000006044820152606401610648565b610e0d601480546001019055565b336000908152601160205260409020805460ff191660011790555b610e6884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525085925086915061162a9050565b610ea45760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610648565b6000610eaf60125490565b9050610ebf601280546001019055565b610eca335b82611325565b5050505050565b60006001600160a01b038216610f3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610648565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f815760405162461bcd60e51b81526004016106489061200f565b610f8b6000611640565b565b600360155460ff166003811115610fa657610fa6611f64565b14610fea5760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b6044820152606401610648565b600b54600a54610ffa91906121c8565b601254106110555760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b6064820152608401610648565b600061106060125490565b9050611070601280546001019055565b6108e933610ec4565b60606001805461057490611fd5565b6109e93383836116a2565b600061099360125490565b6006546001600160a01b031633146110c85760405162461bcd60e51b81526004016106489061200f565b600f55565b6110d733836113ad565b6110f35760405162461bcd60e51b81526004016106489061206d565b6110ff84848484611770565b50505050565b606061111060125490565b82111561115f5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610648565b60006009805461116e90611fd5565b90501161118a576040518060200160405280600081525061055f565b6009611195836117a3565b6040516020016111a69291906121db565b60405160208183030381529060405292915050565b600061099360145490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061099360135490565b6006546001600160a01b031633146112295760405162461bcd60e51b81526004016106489061200f565b6001600160a01b03811661128e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610648565b6108e981611640565b6006546001600160a01b031633146112c15760405162461bcd60e51b81526004016106489061200f565b600d55565b6000818152600260205260409020546001600160a01b03166108e95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610648565b6109e98282604051806020016040528060008152506118a4565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611374826109ed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610648565b6000611431836109ed565b9050806001600160a01b0316846001600160a01b03161480611458575061145881856111c6565b8061147c5750836001600160a01b0316611471846105f7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611497826109ed565b6001600160a01b0316146114bd5760405162461bcd60e51b815260040161064890612272565b6001600160a01b03821661151f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610648565b826001600160a01b0316611532826109ed565b6001600160a01b0316146115585760405162461bcd60e51b815260040161064890612272565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b03861683526003909152812080546001929061159b9084906121c8565b90915550506001600160a01b03821660009081526003602052604081208054600192906115c990849061205a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008261163785846118d7565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036117035760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610648565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61177b848484611484565b61178784848484611983565b6110ff5760405162461bcd60e51b8152600401610648906122b7565b6060816000036117ca5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117f457806117de81612309565b91506117ed9050600a83612338565b91506117ce565b60008167ffffffffffffffff81111561180f5761180f611d47565b6040519080825280601f01601f191660200182016040528015611839576020820181803683370190505b5090505b841561147c5761184e6001836121c8565b915061185b600a8661234c565b61186690603061205a565b60f81b81838151811061187b5761187b612360565b60200101906001600160f81b031916908160001a90535061189d600a86612338565b945061183d565b6118ae8383611a84565b6118bb6000848484611983565b6108145760405162461bcd60e51b8152600401610648906122b7565b600081815b845181101561197b5760008582815181106118f9576118f9612360565b6020026020010151905080831161193b576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611968565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061197381612309565b9150506118dc565b509392505050565b60006001600160a01b0384163b15611a7957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119c7903390899088908890600401612376565b6020604051808303816000875af1925050508015611a02575060408051601f3d908101601f191682019092526119ff918101906123b3565b60015b611a5f573d808015611a30576040519150601f19603f3d011682016040523d82523d6000602084013e611a35565b606091505b508051600003611a575760405162461bcd60e51b8152600401610648906122b7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147c565b506001949350505050565b6001600160a01b038216611ada5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610648565b6000818152600260205260409020546001600160a01b031615611b3f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610648565b6000818152600260205260409020546001600160a01b031615611ba45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610648565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146108e957600080fd5b600060208284031215611c3757600080fd5b8135611c4281611c0f565b9392505050565b60005b83811015611c64578181015183820152602001611c4c565b50506000910152565b60008151808452611c85816020860160208601611c49565b601f01601f19169290920160200192915050565b602081526000611c426020830184611c6d565b600060208284031215611cbe57600080fd5b5035919050565b80356001600160a01b0381168114611cdc57600080fd5b919050565b60008060408385031215611cf457600080fd5b611cfd83611cc5565b946020939093013593505050565b600080600060608486031215611d2057600080fd5b611d2984611cc5565b9250611d3760208501611cc5565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d7857611d78611d47565b604051601f8501601f19908116603f01168101908282118183101715611da057611da0611d47565b81604052809350858152868686011115611db957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611de557600080fd5b813567ffffffffffffffff811115611dfc57600080fd5b8201601f81018413611e0d57600080fd5b61147c84823560208401611d5d565b60008060208385031215611e2f57600080fd5b823567ffffffffffffffff80821115611e4757600080fd5b818501915085601f830112611e5b57600080fd5b813581811115611e6a57600080fd5b8660208260051b8501011115611e7f57600080fd5b60209290920196919550909350505050565b600060208284031215611ea357600080fd5b611c4282611cc5565b60008060408385031215611ebf57600080fd5b611ec883611cc5565b915060208301358015158114611edd57600080fd5b809150509250929050565b60008060008060808587031215611efe57600080fd5b611f0785611cc5565b9350611f1560208601611cc5565b925060408501359150606085013567ffffffffffffffff811115611f3857600080fd5b8501601f81018713611f4957600080fd5b611f5887823560208401611d5d565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611f9c57634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611fb557600080fd5b611fbe83611cc5565b9150611fcc60208401611cc5565b90509250929050565b600181811c90821680611fe957607f821691505b60208210810361200957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561055f5761055f612044565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f82111561081457600081815260208120601f850160051c810160208610156120e15750805b601f850160051c820191505b81811015612100578281556001016120ed565b505050505050565b815167ffffffffffffffff81111561212257612122611d47565b612136816121308454611fd5565b846120ba565b602080601f83116001811461216b57600084156121535750858301515b600019600386901b1c1916600185901b178555612100565b600085815260208120601f198616915b8281101561219a5788860151825594840194600190910190840161217b565b50858210156121b85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561055f5761055f612044565b60008084546121e981611fd5565b60018281168015612201576001811461221657612245565b60ff1984168752821515830287019450612245565b8860005260208060002060005b8581101561223c5781548a820152908401908201612223565b50505082870194505b505050508351612259818360208801611c49565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161231b5761231b612044565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261234757612347612322565b500490565b60008261235b5761235b612322565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123a990830184611c6d565b9695505050505050565b6000602082840312156123c557600080fd5b8151611c4281611c0f56fea26469706673582212200a50179a002a147fad638665b7b0e7e0cb963d27cd44cd1fe56f0fa3f6802b4e64736f6c63430008120033
Deployed Bytecode Sourcemap
42369:9284:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27085:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27085:305:0;;;;;;;;28013:100;;;:::i;:::-;;;;;;;:::i;29525:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;29525:171:0;1533:203:1;48208:631:0;;;;;;:::i;:::-;;:::i;:::-;;29043:416;;;;;;:::i;:::-;;:::i;50747:481::-;;;;;;:::i;:::-;;:::i;51550:96::-;;;;;;:::i;:::-;;:::i;30225:301::-;;;;;;:::i;:::-;;:::i;42835:32::-;;;;;;;;;2657:25:1;;;2645:2;2630:18;42835:32:0;2511:177:1;42744:25:0;;;;;;48954:123;;;;;;:::i;:::-;;:::i;50336:304::-;;;:::i;30597:151::-;;;;;;:::i;:::-;;:::i;42660:29::-;;;;;;44205:104;;;;;;:::i;:::-;;:::i;27723:223::-;;;;;;:::i;:::-;;:::i;42474:21::-;;;:::i;44923:2563::-;;;;;;:::i;:::-;;:::i;27454:207::-;;;;;;:::i;:::-;;:::i;21931:103::-;;;:::i;43138:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47545:521;;;:::i;21105:87::-;21178:6;;-1:-1:-1;;;;;21178:6:0;21105:87;;28182:104;;;:::i;29768:155::-;;;;;;:::i;:::-;;:::i;49342:227::-;;;:::i;49150:127::-;;;;;;:::i;:::-;;:::i;43080:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30819:279;;;;;;:::i;:::-;;:::i;43728:45::-;;;;;;;;;;;;;;;;:::i;44425:298::-;;;;;;:::i;:::-;;:::i;50003:272::-;;;:::i;42550:31::-;;;;;;42929:36;;;;;;29994:164;;;;;;:::i;:::-;;:::i;49652:264::-;;;:::i;22189:201::-;;;;;;:::i;:::-;;:::i;21274:93::-;21350:9;;-1:-1:-1;;;;;21350:9:0;21274:93;;51341:100;;;;;;:::i;:::-;;:::i;42623:29::-;;;;;;27085:305;27187:4;-1:-1:-1;;;;;;27224:40:0;;-1:-1:-1;;;27224:40:0;;:105;;-1:-1:-1;;;;;;;27281:48:0;;-1:-1:-1;;;27281:48:0;27224:105;:158;;;-1:-1:-1;;;;;;;;;;25803:40:0;;;27346:36;27204:178;27085:305;-1:-1:-1;;27085:305:0:o;28013:100::-;28067:13;28100:5;28093:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28013:100;:::o;29525:171::-;29601:7;29621:23;29636:7;29621:14;:23::i;:::-;-1:-1:-1;29664:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29664:24:0;;29525:171::o;48208:631::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;;;;;;;;;48364:8:::1;::::0;48346:14:::1;::::0;48337:23:::1;::::0;:6;:23:::1;:::i;:::-;:35;;48329:78;;;::::0;-1:-1:-1;;;48329:78:0;;8074:2:1;48329:78:0::1;::::0;::::1;8056:21:1::0;8113:2;8093:18;;;8086:30;8152:32;8132:18;;;8125:60;8202:18;;48329:78:0::1;7872:354:1::0;48329:78:0::1;48433:6;48429:368;48445:6;48441:1;:10;48429:368;;;48524:15;48542:25;:15;1046:14:::0;;954:114;48542:25:::1;48524:43;;48582:27;:15;1165:19:::0;;1183:1;1165:19;;;1076:127;48582:27:::1;48658:22;48668:2;48672:7;48658:9;:22::i;:::-;-1:-1:-1::0;48767:3:0::1;;48429:368;;;;48825:6;48807:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;48208:631:0:o;29043:416::-;29124:13;29140:23;29155:7;29140:14;:23::i;:::-;29124:39;;29188:5;-1:-1:-1;;;;;29182:11:0;:2;-1:-1:-1;;;;;29182:11:0;;29174:57;;;;-1:-1:-1;;;29174:57:0;;8433:2:1;29174:57:0;;;8415:21:1;8472:2;8452:18;;;8445:30;8511:34;8491:18;;;8484:62;-1:-1:-1;;;8562:18:1;;;8555:31;8603:19;;29174:57:0;8231:397:1;29174:57:0;19829:10;-1:-1:-1;;;;;29266:21:0;;;;:62;;-1:-1:-1;29291:37:0;29308:5;19829:10;29994:164;:::i;29291:37::-;29244:173;;;;-1:-1:-1;;;29244:173:0;;8835:2:1;29244:173:0;;;8817:21:1;8874:2;8854:18;;;8847:30;8913:34;8893:18;;;8886:62;8984:31;8964:18;;;8957:59;9033:19;;29244:173:0;8633:425:1;29244:173:0;29430:21;29439:2;29443:7;29430:8;:21::i;:::-;29113:346;29043:416;;:::o;50747:481::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;50840:1:::1;50827:10;:14;50819:41;;;::::0;-1:-1:-1;;;50819:41:0;;9265:2:1;50819:41:0::1;::::0;::::1;9247:21:1::0;9304:2;9284:18;;;9277:30;-1:-1:-1;;;9323:18:1;;;9316:44;9377:18;;50819:41:0::1;9063:338:1::0;50819:41:0::1;50885:10;50899:1;50885:15:::0;50881:340:::1;;50917:9;:28:::0;;50929:16:::1;::::0;50917:9;-1:-1:-1;;50917:28:0::1;::::0;50929:16;50917:28:::1;;;;;;50747:481:::0;:::o;50881:340::-:1;50976:10;50990:1;50976:15:::0;50972:249:::1;;51008:9;:32:::0;;51020:20:::1;::::0;51008:9;-1:-1:-1;;51008:32:0::1;51020:20:::0;;51008:32:::1;::::0;50972:249:::1;51071:10;51085:1;51071:15:::0;51067:154:::1;;51103:9;:36:::0;;51115:24:::1;::::0;51103:9;-1:-1:-1;;51103:36:0::1;::::0;51115:24;51103:36:::1;::::0;51067:154:::1;51181:9;:28:::0;;-1:-1:-1;;51181:28:0::1;51193:16;51181:28;::::0;;51067:154:::1;50747:481:::0;:::o;51550:96::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;51621:8:::1;:16:::0;51550:96::o;30225:301::-;30386:41;19829:10;30419:7;30386:18;:41::i;:::-;30378:99;;;;-1:-1:-1;;;30378:99:0;;;;;;;:::i;:::-;30490:28;30500:4;30506:2;30510:7;30490:9;:28::i;48954:123::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;49038:17:::1;:31:::0;48954:123::o;50336:304::-;50388:7;50584:47;:37;1046:14;;954:114;50584:47;50538:33;1046:14;50538:93;;;;:::i;:::-;50531:100;;50336:304;:::o;30597:151::-;30701:39;30718:4;30724:2;30728:7;30701:39;;;;;;;;;;;;:16;:39::i;44205:104::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;44281:7:::1;:20;44291:10:::0;44281:7;:20:::1;:::i;:::-;;44205:104:::0;:::o;27723:223::-;27795:7;32456:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32456:16:0;;27859:56;;;;-1:-1:-1;;;27859:56:0;;12226:2:1;27859:56:0;;;12208:21:1;12265:2;12245:18;;;12238:30;-1:-1:-1;;;12284:18:1;;;12277:54;12348:18;;27859:56:0;12024:348:1;42474:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44923:2563::-;45054:20;45041:9;;;;:33;;;;;;;;:::i;:::-;;:74;;;-1:-1:-1;45091:24:0;45078:9;;;;:37;;;;;;;;:::i;:::-;;45041:74;45033:118;;;;-1:-1:-1;;;45033:118:0;;12579:2:1;45033:118:0;;;12561:21:1;12618:2;12598:18;;;12591:30;12657:33;12637:18;;;12630:61;12708:18;;45033:118:0;12377:355:1;45033:118:0;45200:9;;45172:15;1046:14;45172:37;45164:67;;;;-1:-1:-1;;;45164:67:0;;12939:2:1;45164:67:0;;;12921:21:1;12978:2;12958:18;;;12951:30;-1:-1:-1;;;12997:18:1;;;12990:47;13054:18;;45164:67:0;12737:341:1;45164:67:0;45318:30;;-1:-1:-1;;19829:10:0;13232:2:1;13228:15;13224:53;45318:30:0;;;13212:66:1;45293:12:0;;13294::1;;45318:30:0;;;-1:-1:-1;;45318:30:0;;;;;;;;;45308:41;;45318:30;45308:41;;;;;-1:-1:-1;45418:12:0;45541:20;45528:9;;;;:33;;;;;;;;:::i;:::-;;45524:728;;-1:-1:-1;45630:17:0;;19829:10;45740:32;;;;:18;:32;;;;;;;;:41;45732:92;;;;-1:-1:-1;;;45732:92:0;;13519:2:1;45732:92:0;;;13501:21:1;13558:2;13538:18;;;13531:30;13597:34;13577:18;;;13570:62;-1:-1:-1;;;13648:18:1;;;13641:36;13694:19;;45732:92:0;13317:402:1;45732:92:0;45967:10;;45932:32;:30;:32::i;:::-;:45;45924:86;;;;-1:-1:-1;;;45924:86:0;;13926:2:1;45924:86:0;;;13908:21:1;13965:2;13945:18;;;13938:30;14004;13984:18;;;13977:58;14052:18;;45924:86:0;13724:352:1;45924:86:0;46094:45;:33;1165:19;;1183:1;1165:19;;;1076:127;46094:45;19829:10;46201:32;;;;:18;:32;;;;;:39;;-1:-1:-1;;46201:39:0;46236:4;46201:39;;;45524:728;46365:24;46352:9;;;;:37;;;;;;;;:::i;:::-;;46348:802;;-1:-1:-1;46458:21:0;;19829:10;46576:36;;;;:22;:36;;;;;;;;:45;46568:100;;;;-1:-1:-1;;;46568:100:0;;14283:2:1;46568:100:0;;;14265:21:1;14322:2;14302:18;;;14295:30;14361:34;14341:18;;;14334:62;-1:-1:-1;;;14412:18:1;;;14405:40;14462:19;;46568:100:0;14081:406:1;46568:100:0;46923:10;;46912:8;;46900:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46861:36;:34;:36::i;:::-;:72;46853:113;;;;-1:-1:-1;;;46853:113:0;;14827:2:1;46853:113:0;;;14809:21:1;14866:2;14846:18;;;14839:30;14905;14885:18;;;14878:58;14953:18;;46853:113:0;14625:352:1;46853:113:0;46984:49;:37;1165:19;;1183:1;1165:19;;;1076:127;46984:49;19829:10;47095:36;;;;:22;:36;;;;;:43;;-1:-1:-1;;47095:43:0;47134:4;47095:43;;;46348:802;47205:37;47224:5;;47205:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47231:4:0;;-1:-1:-1;47237:4:0;;-1:-1:-1;47205:18:0;;-1:-1:-1;47205:37:0:i;:::-;47197:63;;;;-1:-1:-1;;;47197:63:0;;15184:2:1;47197:63:0;;;15166:21:1;15223:2;15203:18;;;15196:30;-1:-1:-1;;;15242:18:1;;;15235:43;15295:18;;47197:63:0;14982:337:1;47197:63:0;47324:15;47342:25;:15;1046:14;;954:114;47342:25;47324:43;;47378:27;:15;1165:19;;1183:1;1165:19;;;1076:127;47378:27;47446:32;19829:10;47456:12;47470:7;47446:9;:32::i;:::-;44981:2505;;;44923:2563;;:::o;27454:207::-;27526:7;-1:-1:-1;;;;;27554:19:0;;27546:73;;;;-1:-1:-1;;;27546:73:0;;15526:2:1;27546:73:0;;;15508:21:1;15565:2;15545:18;;;15538:30;15604:34;15584:18;;;15577:62;-1:-1:-1;;;15655:18:1;;;15648:39;15704:19;;27546:73:0;15324:405:1;27546:73:0;-1:-1:-1;;;;;;27637:16:0;;;;;:9;:16;;;;;;;27454:207::o;21931:103::-;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;21996:30:::1;22023:1;21996:18;:30::i;:::-;21931:103::o:0;47545:521::-;47610:16;47597:9;;;;:29;;;;;;;;:::i;:::-;;47589:62;;;;-1:-1:-1;;;47589:62:0;;15936:2:1;47589:62:0;;;15918:21:1;15975:2;15955:18;;;15948:30;-1:-1:-1;;;15994:18:1;;;15987:50;16054:18;;47589:62:0;15734:344:1;47589:62:0;47792:8;;47780:9;;:20;;;;:::i;:::-;47752:15;1046:14;47752:48;47744:95;;;;-1:-1:-1;;;47744:95:0;;16285:2:1;47744:95:0;;;16267:21:1;16324:2;16304:18;;;16297:30;16363:34;16343:18;;;16336:62;-1:-1:-1;;;16414:18:1;;;16407:32;16456:19;;47744:95:0;16083:398:1;47744:95:0;47904:15;47922:25;:15;1046:14;;954:114;47922:25;47904:43;;47958:27;:15;1165:19;;1183:1;1165:19;;;1076:127;47958:27;48026:32;19829:10;48036:12;19749:98;28182:104;28238:13;28271:7;28264:14;;;;;:::i;29768:155::-;29863:52;19829:10;29896:8;29906;29863:18;:52::i;49342:227::-;49385:7;49535:25;:15;1046:14;;954:114;49150:127;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;49234:21:::1;:35:::0;49150:127::o;30819:279::-;30950:41;19829:10;30983:7;30950:18;:41::i;:::-;30942:99;;;;-1:-1:-1;;;30942:99:0;;;;;;;:::i;:::-;31052:38;31066:4;31072:2;31076:7;31085:4;31052:13;:38::i;:::-;30819:279;;;;:::o;44425:298::-;44498:13;44543:25;:15;1046:14;;954:114;44543:25;44532:7;:36;;44524:80;;;;-1:-1:-1;;;44524:80:0;;16688:2:1;44524:80:0;;;16670:21:1;16727:2;16707:18;;;16700:30;16766:33;16746:18;;;16739:61;16817:18;;44524:80:0;16486:355:1;44524:80:0;44648:1;44630:7;44624:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44666:7;44675:25;44692:7;44675:16;:25::i;:::-;44652:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44617:98;44425:298;-1:-1:-1;;44425:298:0:o;50003:272::-;50069:7;50219:47;:37;1046:14;;954:114;29994:164;-1:-1:-1;;;;;30115:25:0;;;30091:4;30115:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29994:164::o;49652:264::-;49714:7;49864:43;:33;1046:14;;954:114;22189:201;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22278:22:0;::::1;22270:73;;;::::0;-1:-1:-1;;;22270:73:0;;18229:2:1;22270:73:0::1;::::0;::::1;18211:21:1::0;18268:2;18248:18;;;18241:30;18307:34;18287:18;;;18280:62;-1:-1:-1;;;18358:18:1;;;18351:36;18404:19;;22270:73:0::1;18027:402:1::0;22270:73:0::1;22354:28;22373:8;22354:18;:28::i;51341:100::-:0;21178:6;;-1:-1:-1;;;;;21178:6:0;19829:10;21500:23;21492:68;;;;-1:-1:-1;;;21492:68:0;;;;;;;:::i;:::-;51414:10:::1;:18:::0;51341:100::o;38519:135::-;32858:4;32456:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32456:16:0;38593:53;;;;-1:-1:-1;;;38593:53:0;;12226:2:1;38593:53:0;;;12208:21:1;12265:2;12245:18;;;12238:30;-1:-1:-1;;;12284:18:1;;;12277:54;12348:18;;38593:53:0;12024:348:1;33778:110:0;33854:26;33864:2;33868:7;33854:26;;;;;;;;;;;;:9;:26::i;37832:174::-;37907:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37907:29:0;-1:-1:-1;;;;;37907:29:0;;;;;;;;:24;;37961:23;37907:24;37961:14;:23::i;:::-;-1:-1:-1;;;;;37952:46:0;;;;;;;;;;;37832:174;;:::o;33088:348::-;33181:4;32456:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32456:16:0;33198:73;;;;-1:-1:-1;;;33198:73:0;;18636:2:1;33198:73:0;;;18618:21:1;18675:2;18655:18;;;18648:30;18714:34;18694:18;;;18687:62;-1:-1:-1;;;18765:18:1;;;18758:42;18817:19;;33198:73:0;18434:408:1;33198:73:0;33282:13;33298:23;33313:7;33298:14;:23::i;:::-;33282:39;;33351:5;-1:-1:-1;;;;;33340:16:0;:7;-1:-1:-1;;;;;33340:16:0;;:52;;;;33360:32;33377:5;33384:7;33360:16;:32::i;:::-;33340:87;;;;33420:7;-1:-1:-1;;;;;33396:31:0;:20;33408:7;33396:11;:20::i;:::-;-1:-1:-1;;;;;33396:31:0;;33340:87;33332:96;33088:348;-1:-1:-1;;;;33088:348:0:o;36928:785::-;37053:4;-1:-1:-1;;;;;37026:31:0;:23;37041:7;37026:14;:23::i;:::-;-1:-1:-1;;;;;37026:31:0;;37018:81;;;;-1:-1:-1;;;37018:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37118:16:0;;37110:65;;;;-1:-1:-1;;;37110:65:0;;19455:2:1;37110:65:0;;;19437:21:1;19494:2;19474:18;;;19467:30;19533:34;19513:18;;;19506:62;-1:-1:-1;;;19584:18:1;;;19577:34;19628:19;;37110:65:0;19253:400:1;37110:65:0;37360:4;-1:-1:-1;;;;;37333:31:0;:23;37348:7;37333:14;:23::i;:::-;-1:-1:-1;;;;;37333:31:0;;37325:81;;;;-1:-1:-1;;;37325:81:0;;;;;;;:::i;:::-;37478:24;;;;:15;:24;;;;;;;;37471:31;;-1:-1:-1;;;;;;37471:31:0;;;-1:-1:-1;;;;;37515:15:0;;;;:9;:15;;;;;:20;;37471:31;;37478:24;37515:20;;37471:31;;37515:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37546:13:0;;;;;;:9;:13;;;;;:18;;37563:1;;37546:13;:18;;37563:1;;37546:18;:::i;:::-;;;;-1:-1:-1;;37585:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37585:21:0;-1:-1:-1;;;;;37585:21:0;;;;;;;;;37624:27;;37585:16;;37624:27;;;;;;;29113:346;29043:416;;:::o;2382:190::-;2507:4;2560;2531:25;2544:5;2551:4;2531:12;:25::i;:::-;:33;;2382:190;-1:-1:-1;;;;2382:190:0:o;22550:275::-;22644:6;;;22661:9;:21;;-1:-1:-1;;;;;;22661:21:0;;;-1:-1:-1;;;;;22644:6:0;;;22661:21;;;;;;22693:17;;;;;;;;;;22745:15;22721:21;:39;22776:41;;22644:6;;22776:41;;22624:17;;22776:41;22613:212;22550:275;:::o;38149:281::-;38270:8;-1:-1:-1;;;;;38261:17:0;:5;-1:-1:-1;;;;;38261:17:0;;38253:55;;;;-1:-1:-1;;;38253:55:0;;19860:2:1;38253:55:0;;;19842:21:1;19899:2;19879:18;;;19872:30;19938:27;19918:18;;;19911:55;19983:18;;38253:55:0;19658:349:1;38253:55:0;-1:-1:-1;;;;;38319:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38319:46:0;;;;;;;;;;38381:41;;540::1;;;38381::0;;513:18:1;38381:41:0;;;;;;;38149:281;;;:::o;31979:270::-;32092:28;32102:4;32108:2;32112:7;32092:9;:28::i;:::-;32139:47;32162:4;32168:2;32172:7;32181:4;32139:22;:47::i;:::-;32131:110;;;;-1:-1:-1;;;32131:110:0;;;;;;;:::i;23141:723::-;23197:13;23418:5;23427:1;23418:10;23414:53;;-1:-1:-1;;23445:10:0;;;;;;;;;;;;-1:-1:-1;;;23445:10:0;;;;;23141:723::o;23414:53::-;23492:5;23477:12;23533:78;23540:9;;23533:78;;23566:8;;;;:::i;:::-;;-1:-1:-1;23589:10:0;;-1:-1:-1;23597:2:0;23589:10;;:::i;:::-;;;23533:78;;;23621:19;23653:6;23643:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23643:17:0;;23621:39;;23671:154;23678:10;;23671:154;;23705:11;23715:1;23705:11;;:::i;:::-;;-1:-1:-1;23774:10:0;23782:2;23774:5;:10;:::i;:::-;23761:24;;:2;:24;:::i;:::-;23748:39;;23731:6;23738;23731:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23731:56:0;;;;;;;;-1:-1:-1;23802:11:0;23811:2;23802:11;;:::i;:::-;;;23671:154;;34115:285;34210:18;34216:2;34220:7;34210:5;:18::i;:::-;34261:53;34292:1;34296:2;34300:7;34309:4;34261:22;:53::i;:::-;34239:153;;;;-1:-1:-1;;;34239:153:0;;;;;;;:::i;2934:701::-;3017:7;3060:4;3017:7;3075:523;3099:5;:12;3095:1;:16;3075:523;;;3133:20;3156:5;3162:1;3156:8;;;;;;;;:::i;:::-;;;;;;;3133:31;;3199:12;3183;:28;3179:408;;3336:44;;;;;;21234:19:1;;;21269:12;;;21262:28;;;21306:12;;3336:44:0;;;;;;;;;;;;3326:55;;;;;;3311:70;;3179:408;;;3526:44;;;;;;21234:19:1;;;21269:12;;;21262:28;;;21306:12;;3526:44:0;;;;;;;;;;;;3516:55;;;;;;3501:70;;3179:408;-1:-1:-1;3113:3:0;;;;:::i;:::-;;;;3075:523;;;-1:-1:-1;3615:12:0;2934:701;-1:-1:-1;;;2934:701:0:o;39218:853::-;39372:4;-1:-1:-1;;;;;39393:13:0;;12062:20;12110:8;39389:675;;39429:71;;-1:-1:-1;;;39429:71:0;;-1:-1:-1;;;;;39429:36:0;;;;;:71;;19829:10;;39480:4;;39486:7;;39495:4;;39429:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39429:71:0;;;;;;;;-1:-1:-1;;39429:71:0;;;;;;;;;;;;:::i;:::-;;;39425:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39670:6;:13;39687:1;39670:18;39666:328;;39713:60;;-1:-1:-1;;;39713:60:0;;;;;;;:::i;39666:328::-;39944:6;39938:13;39929:6;39925:2;39921:15;39914:38;39425:584;-1:-1:-1;;;;;;39551:51:0;-1:-1:-1;;;39551:51:0;;-1:-1:-1;39544:58:0;;39389:675;-1:-1:-1;40048:4:0;39218:853;;;;;;:::o;34736:942::-;-1:-1:-1;;;;;34816:16:0;;34808:61;;;;-1:-1:-1;;;34808:61:0;;22279:2:1;34808:61:0;;;22261:21:1;;;22298:18;;;22291:30;22357:34;22337:18;;;22330:62;22409:18;;34808:61:0;22077:356:1;34808:61:0;32858:4;32456:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32456:16:0;32882:31;34880:58;;;;-1:-1:-1;;;34880:58:0;;22640:2:1;34880:58:0;;;22622:21:1;22679:2;22659:18;;;22652:30;22718;22698:18;;;22691:58;22766:18;;34880:58:0;22438:352:1;34880:58:0;32858:4;32456:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32456:16:0;32882:31;35089:58;;;;-1:-1:-1;;;35089:58:0;;22640:2:1;35089:58:0;;;22622:21:1;22679:2;22659:18;;;22652:30;22718;22698:18;;;22691:58;22766:18;;35089:58:0;22438:352:1;35089:58:0;-1:-1:-1;;;;;35496:13:0;;;;;;:9;:13;;;;;;;;:18;;35513:1;35496:18;;;35538:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35538:21:0;;;;;35577:33;35546:7;;35496:13;;35577:33;;35496:13;;35577:33;44281:20:::1;44205:104:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:328::-;2255:6;2263;2271;2324:2;2312:9;2303:7;2299:23;2295:32;2292:52;;;2340:1;2337;2330:12;2292:52;2363:29;2382:9;2363:29;:::i;:::-;2353:39;;2411:38;2445:2;2434:9;2430:18;2411:38;:::i;:::-;2401:48;;2496:2;2485:9;2481:18;2468:32;2458:42;;2178:328;;;;;:::o;3060:127::-;3121:10;3116:3;3112:20;3109:1;3102:31;3152:4;3149:1;3142:15;3176:4;3173:1;3166:15;3192:632;3257:5;3287:18;3328:2;3320:6;3317:14;3314:40;;;3334:18;;:::i;:::-;3409:2;3403:9;3377:2;3463:15;;-1:-1:-1;;3459:24:1;;;3485:2;3455:33;3451:42;3439:55;;;3509:18;;;3529:22;;;3506:46;3503:72;;;3555:18;;:::i;:::-;3595:10;3591:2;3584:22;3624:6;3615:15;;3654:6;3646;3639:22;3694:3;3685:6;3680:3;3676:16;3673:25;3670:45;;;3711:1;3708;3701:12;3670:45;3761:6;3756:3;3749:4;3741:6;3737:17;3724:44;3816:1;3809:4;3800:6;3792;3788:19;3784:30;3777:41;;;;3192:632;;;;;:::o;3829:451::-;3898:6;3951:2;3939:9;3930:7;3926:23;3922:32;3919:52;;;3967:1;3964;3957:12;3919:52;4007:9;3994:23;4040:18;4032:6;4029:30;4026:50;;;4072:1;4069;4062:12;4026:50;4095:22;;4148:4;4140:13;;4136:27;-1:-1:-1;4126:55:1;;4177:1;4174;4167:12;4126:55;4200:74;4266:7;4261:2;4248:16;4243:2;4239;4235:11;4200:74;:::i;4285:615::-;4371:6;4379;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4488:9;4475:23;4517:18;4558:2;4550:6;4547:14;4544:34;;;4574:1;4571;4564:12;4544:34;4612:6;4601:9;4597:22;4587:32;;4657:7;4650:4;4646:2;4642:13;4638:27;4628:55;;4679:1;4676;4669:12;4628:55;4719:2;4706:16;4745:2;4737:6;4734:14;4731:34;;;4761:1;4758;4751:12;4731:34;4814:7;4809:2;4799:6;4796:1;4792:14;4788:2;4784:23;4780:32;4777:45;4774:65;;;4835:1;4832;4825:12;4774:65;4866:2;4858:11;;;;;4888:6;;-1:-1:-1;4285:615:1;;-1:-1:-1;;;;4285:615:1:o;4905:186::-;4964:6;5017:2;5005:9;4996:7;4992:23;4988:32;4985:52;;;5033:1;5030;5023:12;4985:52;5056:29;5075:9;5056:29;:::i;5096:347::-;5161:6;5169;5222:2;5210:9;5201:7;5197:23;5193:32;5190:52;;;5238:1;5235;5228:12;5190:52;5261:29;5280:9;5261:29;:::i;:::-;5251:39;;5340:2;5329:9;5325:18;5312:32;5387:5;5380:13;5373:21;5366:5;5363:32;5353:60;;5409:1;5406;5399:12;5353:60;5432:5;5422:15;;;5096:347;;;;;:::o;5448:667::-;5543:6;5551;5559;5567;5620:3;5608:9;5599:7;5595:23;5591:33;5588:53;;;5637:1;5634;5627:12;5588:53;5660:29;5679:9;5660:29;:::i;:::-;5650:39;;5708:38;5742:2;5731:9;5727:18;5708:38;:::i;:::-;5698:48;;5793:2;5782:9;5778:18;5765:32;5755:42;;5848:2;5837:9;5833:18;5820:32;5875:18;5867:6;5864:30;5861:50;;;5907:1;5904;5897:12;5861:50;5930:22;;5983:4;5975:13;;5971:27;-1:-1:-1;5961:55:1;;6012:1;6009;6002:12;5961:55;6035:74;6101:7;6096:2;6083:16;6078:2;6074;6070:11;6035:74;:::i;:::-;6025:84;;;5448:667;;;;;;;:::o;6120:127::-;6181:10;6176:3;6172:20;6169:1;6162:31;6212:4;6209:1;6202:15;6236:4;6233:1;6226:15;6252:342;6398:2;6383:18;;6431:1;6420:13;;6410:144;;6476:10;6471:3;6467:20;6464:1;6457:31;6511:4;6508:1;6501:15;6539:4;6536:1;6529:15;6410:144;6563:25;;;6252:342;:::o;6599:260::-;6667:6;6675;6728:2;6716:9;6707:7;6703:23;6699:32;6696:52;;;6744:1;6741;6734:12;6696:52;6767:29;6786:9;6767:29;:::i;:::-;6757:39;;6815:38;6849:2;6838:9;6834:18;6815:38;:::i;:::-;6805:48;;6599:260;;;;;:::o;6864:380::-;6943:1;6939:12;;;;6986;;;7007:61;;7061:4;7053:6;7049:17;7039:27;;7007:61;7114:2;7106:6;7103:14;7083:18;7080:38;7077:161;;7160:10;7155:3;7151:20;7148:1;7141:31;7195:4;7192:1;7185:15;7223:4;7220:1;7213:15;7077:161;;6864:380;;;:::o;7249:356::-;7451:2;7433:21;;;7470:18;;;7463:30;7529:34;7524:2;7509:18;;7502:62;7596:2;7581:18;;7249:356::o;7610:127::-;7671:10;7666:3;7662:20;7659:1;7652:31;7702:4;7699:1;7692:15;7726:4;7723:1;7716:15;7742:125;7807:9;;;7828:10;;;7825:36;;;7841:18;;:::i;9406:409::-;9608:2;9590:21;;;9647:2;9627:18;;;9620:30;9686:34;9681:2;9666:18;;9659:62;-1:-1:-1;;;9752:2:1;9737:18;;9730:43;9805:3;9790:19;;9406:409::o;9946:545::-;10048:2;10043:3;10040:11;10037:448;;;10084:1;10109:5;10105:2;10098:17;10154:4;10150:2;10140:19;10224:2;10212:10;10208:19;10205:1;10201:27;10195:4;10191:38;10260:4;10248:10;10245:20;10242:47;;;-1:-1:-1;10283:4:1;10242:47;10338:2;10333:3;10329:12;10326:1;10322:20;10316:4;10312:31;10302:41;;10393:82;10411:2;10404:5;10401:13;10393:82;;;10456:17;;;10437:1;10426:13;10393:82;;;10397:3;;;9946:545;;;:::o;10667:1352::-;10793:3;10787:10;10820:18;10812:6;10809:30;10806:56;;;10842:18;;:::i;:::-;10871:97;10961:6;10921:38;10953:4;10947:11;10921:38;:::i;:::-;10915:4;10871:97;:::i;:::-;11023:4;;11087:2;11076:14;;11104:1;11099:663;;;;11806:1;11823:6;11820:89;;;-1:-1:-1;11875:19:1;;;11869:26;11820:89;-1:-1:-1;;10624:1:1;10620:11;;;10616:24;10612:29;10602:40;10648:1;10644:11;;;10599:57;11922:81;;11069:944;;11099:663;9893:1;9886:14;;;9930:4;9917:18;;-1:-1:-1;;11135:20:1;;;11253:236;11267:7;11264:1;11261:14;11253:236;;;11356:19;;;11350:26;11335:42;;11448:27;;;;11416:1;11404:14;;;;11283:19;;11253:236;;;11257:3;11517:6;11508:7;11505:19;11502:201;;;11578:19;;;11572:26;-1:-1:-1;;11661:1:1;11657:14;;;11673:3;11653:24;11649:37;11645:42;11630:58;11615:74;;11502:201;-1:-1:-1;;;;;11749:1:1;11733:14;;;11729:22;11716:36;;-1:-1:-1;10667:1352:1:o;14492:128::-;14559:9;;;14580:11;;;14577:37;;;14594:18;;:::i;16846:1176::-;17112:3;17141:1;17174:6;17168:13;17204:36;17230:9;17204:36;:::i;:::-;17259:1;17276:18;;;17303:133;;;;17450:1;17445:356;;;;17269:532;;17303:133;-1:-1:-1;;17336:24:1;;17324:37;;17409:14;;17402:22;17390:35;;17381:45;;;-1:-1:-1;17303:133:1;;17445:356;17476:6;17473:1;17466:17;17506:4;17551:2;17548:1;17538:16;17576:1;17590:165;17604:6;17601:1;17598:13;17590:165;;;17682:14;;17669:11;;;17662:35;17725:16;;;;17619:10;;17590:165;;;17594:3;;;17784:6;17779:3;17775:16;17768:23;;17269:532;;;;;17832:6;17826:13;17848:68;17907:8;17902:3;17895:4;17887:6;17883:17;17848:68;:::i;:::-;-1:-1:-1;;;17938:18:1;;17965:22;;;18014:1;18003:13;;16846:1176;-1:-1:-1;;;;16846:1176:1:o;18847:401::-;19049:2;19031:21;;;19088:2;19068:18;;;19061:30;19127:34;19122:2;19107:18;;19100:62;-1:-1:-1;;;19193:2:1;19178:18;;19171:35;19238:3;19223:19;;18847:401::o;20012:414::-;20214:2;20196:21;;;20253:2;20233:18;;;20226:30;20292:34;20287:2;20272:18;;20265:62;-1:-1:-1;;;20358:2:1;20343:18;;20336:48;20416:3;20401:19;;20012:414::o;20431:135::-;20470:3;20491:17;;;20488:43;;20511:18;;:::i;:::-;-1:-1:-1;20558:1:1;20547:13;;20431:135::o;20571:127::-;20632:10;20627:3;20623:20;20620:1;20613:31;20663:4;20660:1;20653:15;20687:4;20684:1;20677:15;20703:120;20743:1;20769;20759:35;;20774:18;;:::i;:::-;-1:-1:-1;20808:9:1;;20703:120::o;20828:112::-;20860:1;20886;20876:35;;20891:18;;:::i;:::-;-1:-1:-1;20925:9:1;;20828:112::o;20945:127::-;21006:10;21001:3;20997:20;20994:1;20987:31;21037:4;21034:1;21027:15;21061:4;21058:1;21051:15;21329:489;-1:-1:-1;;;;;21598:15:1;;;21580:34;;21650:15;;21645:2;21630:18;;21623:43;21697:2;21682:18;;21675:34;;;21745:3;21740:2;21725:18;;21718:31;;;21523:4;;21766:46;;21792:19;;21784:6;21766:46;:::i;:::-;21758:54;21329:489;-1:-1:-1;;;;;;21329:489:1:o;21823:249::-;21892:6;21945:2;21933:9;21924:7;21920:23;21916:32;21913:52;;;21961:1;21958;21951:12;21913:52;21993:9;21987:16;22012:30;22036:5;22012:30;:::i
Swarm Source
ipfs://0a50179a002a147fad638665b7b0e7e0cb963d27cd44cd1fe56f0fa3f6802b4e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.