ERC-721
Source Code
Overview
Max Total Supply
3,333 OSC
Holders
861
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 OSCLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
NFT
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at optimistic.etherscan.io on 2022-12-19
*/
// File: contracts/IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
*/
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from == msg.sender) {
_;
return;
}
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
revert OperatorNotAllowed(msg.sender);
}
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
_;
}
}
// File: contracts/DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: contracts/MerkleProof.sol
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree 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.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
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 Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] calldata leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
* consuming from one or the other at each step according to the instructions given by
* `proofFlags`.
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] calldata leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: contracts/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);
}
}
// File: contracts/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);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/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);
}
// File: contracts/IERC165.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: contracts/ERC165.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: contracts/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;
}
// File: contracts/IERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: contracts/IERC721Metadata.sol
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/ReentrancyGuard.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File: contracts/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: contracts/ERC721A.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
*
* Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
*
* Does not support burning tokens to address(0).
*/
contract ERC721A is
Context,
ERC165,
IERC721,
IERC721Metadata,
IERC721Enumerable
{
using Address for address;
using Strings for uint256;
struct TokenOwnership {
address addr;
uint64 startTimestamp;
}
struct AddressData {
uint128 balance;
uint128 numberMinted;
}
uint256 private currentIndex = 0;
uint256 internal immutable collectionSize;
uint256 internal immutable maxBatchSize;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) private _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev
* `maxBatchSize` refers to how much a minter can mint at a time.
* `collectionSize_` refers to how many tokens are in the collection.
*/
constructor(
string memory name_,
string memory symbol_,
uint256 maxBatchSize_,
uint256 collectionSize_
) {
require(
collectionSize_ > 0,
"ERC721A: collection must have a nonzero supply"
);
require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
_name = name_;
_symbol = symbol_;
maxBatchSize = maxBatchSize_;
collectionSize = collectionSize_;
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return currentIndex;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view override returns (uint256) {
require(index < totalSupply(), "ERC721A: global index out of bounds");
return index;
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
* This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
* It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
*/
function tokenOfOwnerByIndex(address owner, uint256 index)
public
view
override
returns (uint256)
{
require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
uint256 numMintedSoFar = totalSupply();
uint256 tokenIdsIdx = 0;
address currOwnershipAddr = address(0);
for (uint256 i = 0; i < numMintedSoFar; i++) {
TokenOwnership memory ownership = _ownerships[i];
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
if (tokenIdsIdx == index) {
return i;
}
tokenIdsIdx++;
}
}
revert("ERC721A: unable to get token of owner by index");
}
/**
* @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 ||
interfaceId == type(IERC721Enumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
require(owner != address(0), "ERC721A: balance query for the zero address");
return uint256(_addressData[owner].balance);
}
function _numberMinted(address owner) internal view returns (uint256) {
require(
owner != address(0),
"ERC721A: number minted query for the zero address"
);
return uint256(_addressData[owner].numberMinted);
}
function ownershipOf(uint256 tokenId)
internal
view
returns (TokenOwnership memory)
{
require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
uint256 lowestTokenToCheck;
if (tokenId >= maxBatchSize) {
lowestTokenToCheck = tokenId - maxBatchSize + 1;
}
for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
TokenOwnership memory ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
revert("ERC721A: unable to determine the owner of token");
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return ownershipOf(tokenId).addr;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
string memory baseURI = _baseURI();
return
bytes(baseURI).length > 0
? string(abi.encodePacked(baseURI, tokenId.toString()))
: "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721A.ownerOf(tokenId);
require(to != owner, "ERC721A: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721A: approve caller is not owner nor approved for all"
);
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721A: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721A: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator)
public
view
virtual
override
returns (bool)
{
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
_transfer(from, to, tokenId);
require(
_checkOnERC721Received(from, to, tokenId, _data),
"ERC721A: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return tokenId < currentIndex;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, "");
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - there must be `quantity` tokens remaining unminted in the total collection.
* - `to` cannot be the zero address.
* - `quantity` cannot be larger than the max batch size.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
uint256 startTokenId = currentIndex;
require(to != address(0), "ERC721A: mint to the zero address");
// We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
require(!_exists(startTokenId), "ERC721A: token already minted");
require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
AddressData memory addressData = _addressData[to];
_addressData[to] = AddressData(
addressData.balance + uint128(quantity),
addressData.numberMinted + uint128(quantity)
);
_ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));
uint256 updatedIndex = startTokenId;
for (uint256 i = 0; i < quantity; i++) {
emit Transfer(address(0), to, updatedIndex);
require(
_checkOnERC721Received(address(0), to, updatedIndex, _data),
"ERC721A: transfer to non ERC721Receiver implementer"
);
updatedIndex++;
}
currentIndex = updatedIndex;
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) private {
TokenOwnership memory prevOwnership = ownershipOf(tokenId);
bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
getApproved(tokenId) == _msgSender() ||
isApprovedForAll(prevOwnership.addr, _msgSender()));
require(
isApprovedOrOwner,
"ERC721A: transfer caller is not owner nor approved"
);
require(
prevOwnership.addr == from,
"ERC721A: transfer from incorrect owner"
);
require(to != address(0), "ERC721A: transfer to the zero address");
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, prevOwnership.addr);
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
_ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
if (_exists(nextTokenId)) {
_ownerships[nextTokenId] = TokenOwnership(
prevOwnership.addr,
prevOwnership.startTimestamp
);
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
uint256 public nextOwnerToExplicitlySet = 0;
/**
* @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
*/
function _setOwnersExplicit(uint256 quantity) internal {
uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
require(quantity > 0, "quantity must be nonzero");
uint256 endIndex = oldNextOwnerToSet + quantity - 1;
if (endIndex > collectionSize - 1) {
endIndex = collectionSize - 1;
}
// We know if the last one in the group exists, all in the group exist, due to serial ordering.
require(_exists(endIndex), "not enough minted yet for this cleanup");
for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
if (_ownerships[i].addr == address(0)) {
TokenOwnership memory ownership = ownershipOf(i);
_ownerships[i] = TokenOwnership(
ownership.addr,
ownership.startTimestamp
);
}
}
nextOwnerToExplicitlySet = endIndex + 1;
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try
IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721A: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}
// File: contracts/Ownable.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/NFT.sol
// Create by 0xChrisx
pragma solidity ^0.8.0;
contract NFT is Ownable, ERC721A, DefaultOperatorFilterer, ReentrancyGuard {
event Received(address, uint);
uint256 public mintPhase ;
uint256 public mintPrice = 0 ether;
uint256 public collectionSize_ = 3333 ;
uint256 public maxWlRound = 3333 ;
uint256 public maxBatchERC = 20 ; // _safeMint of ERC721A require to set maxBatchSize
uint256 public maxPerWhitelist = 3;
uint256 public maxPerPublic = 3;
bytes32 public WLroot ;
bytes32 public PBseed ;
string private baseURI ;
struct AddressDetail {
uint256 WLBalance ;
uint256 PBBalance ;
}
mapping(address => AddressDetail) public _addressDetail ;
constructor() ERC721A("OptiStickman", "OSC", maxBatchERC , collectionSize_ ) {
}
modifier callerIsUser() {
require(tx.origin == msg.sender, "The caller is another contract");
_;
}
//------------------ BaseURI
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
function setBaseURI (string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
//--------------------- END BaseURI
//--------------------- Set & Change anythings
function setMaxBatch (uint256 newSize) public onlyOwner {
maxBatchERC = newSize ;
}
function setMintPrice (uint256 newPrice) public onlyOwner {
mintPrice = newPrice ;
}
function setCollectionSize (uint256 newCollectionSize) public onlyOwner {
collectionSize_ = newCollectionSize ;
}
function setMaxWlRound (uint256 newMaxWlRound) public onlyOwner {
maxWlRound = newMaxWlRound ;
}
function setMaxPerPublic (uint256 newMaxPerPublic) public onlyOwner {
maxPerPublic = newMaxPerPublic ;
}
function setMaxPerWhitelist (uint256 newMaxPerWhitelist ) public onlyOwner {
maxPerWhitelist = newMaxPerWhitelist;
}
function setWLRoot (bytes32 newWLRoot) public onlyOwner {
WLroot = newWLRoot ;
}
function setPBr (bytes32 newPBR) public onlyOwner {
PBseed = newPBR ;
}
function setPhase (uint256 newPhase) public onlyOwner {
mintPhase = newPhase ;
}
//--------------------- END Set & Change anythings
//--------------------------------------- Mint
//-------------------- DevMint
function mintDev(address _to ,uint256 _mintAmount) external onlyOwner {
require(totalSupply() + _mintAmount <= collectionSize_ , "You can't mint more than collection size");
_safeMint( _to,_mintAmount);
}
//-------------------- END DevMint
//-------------------- WhitelistMint
function mintWhiteList(uint256 _mintAmount , bytes32[] memory _Proof) external payable {
require(mintPhase == 1, "Whitelist round hasn't open yet");
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(
MerkleProof.verify(_Proof, WLroot, leaf),
"You're not whitelist."
);
require(totalSupply() + _mintAmount <= maxWlRound , "Purchase would exceed max tokens");
require(_addressDetail[msg.sender].WLBalance + _mintAmount <= maxPerWhitelist, "Max per address for whitelist. Please try lower.");
require(mintPrice * _mintAmount <= msg.value, "Ether value sent is not correct");
_safeMint(msg.sender, _mintAmount);
_addressDetail[msg.sender].WLBalance += _mintAmount ;
}
//-------------------- END WhitelistMint
//-------------------- PublicMint
function mintPublic(uint256 _mintAmount ,bytes32[] memory PFcode,bytes32 Lcode) external payable callerIsUser {
require(mintPhase == 5, "public sale hasn't begun yet");
require(
MerkleProof.verify(PFcode, PBseed, Lcode),
"You can't mint from SmartContract."
);
require(totalSupply() + _mintAmount <= collectionSize_ , "reached max supply"); // must less than collction size
require(_addressDetail[msg.sender].PBBalance + _mintAmount <= maxPerPublic, "can not mint this many"); // check max mint PerAddress ?
require(msg.value >= mintPrice * _mintAmount, "ETH amount is not sufficient");
_safeMint(msg.sender, _mintAmount);
_addressDetail[msg.sender].PBBalance += _mintAmount ;
}
function numberMinted(address owner) public view returns (uint256) { // check number Minted of that address จำนวนที่มิ้นไปแล้ว ใน address นั้น
return _numberMinted(owner);
}
//-------------------- END PublicMint
//--------------------------------------------- END Mint
//------------------------- Withdraw Money
address private wallet1 = 0x16364a6B7ac1d7085346Ce6A144A1FD35bA80871; // K.Poom
address private wallet2 = 0x4B0A54D5529D34352048022a6e67BB6a26d91A7A; // K.Kayy
address private wallet3 = 0x977EE6f3C17ECB90Ac5504ad92240D40a33ba129; // K.Chris
address private wallet4 = 0xAA15cF63a4852C5fb1614c4BfcFDc032B4E33d98; // K.Yok
address private wallet5 = 0x5350303b367FeA34bFb85Fd0da683eA9D8Ebd550; // VAULT
function withdrawMoney() external payable nonReentrant {
uint256 _paytoW1 = address(this).balance*50/100 ; // K.Poom
uint256 _paytoW2 = address(this).balance*15/100 ; // K.Kayy
uint256 _paytoW3 = address(this).balance*15/100 ; // K.Chris
uint256 _paytoW4 = address(this).balance*15/100 ; // K.Yok
uint256 _paytoW5 = address(this).balance*5/100 ; // VAULT
require(address(this).balance > 0, "No ETH left");
require(payable(wallet1).send(_paytoW1));
require(payable(wallet2).send(_paytoW2));
require(payable(wallet3).send(_paytoW3));
require(payable(wallet4).send(_paytoW4));
require(payable(wallet5).send(_paytoW5));
}
//------------------------- END Withdraw Money
//-------------------- START Fallback Receive Ether Function
receive() external payable {
emit Received(msg.sender, msg.value);
}
//-------------------- END Fallback Receive Ether Function
//-------------------- START DefaultOperaterFilterer
function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
super.approve(operator, tokenId);
}
function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
public
override
onlyAllowedOperator(from)
{
super.safeTransferFrom(from, to, tokenId, data);
}
//--------------------- END DefaultOperaterFilterer
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","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":[],"name":"PBseed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressDetail","outputs":[{"internalType":"uint256","name":"WLBalance","type":"uint256"},{"internalType":"uint256","name":"PBBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchERC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWlRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"PFcode","type":"bytes32[]"},{"internalType":"bytes32","name":"Lcode","type":"bytes32"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"mintWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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":"newCollectionSize","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSize","type":"uint256"}],"name":"setMaxBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerPublic","type":"uint256"}],"name":"setMaxPerPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerWhitelist","type":"uint256"}],"name":"setMaxPerWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWlRound","type":"uint256"}],"name":"setMaxWlRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newPBR","type":"bytes32"}],"name":"setPBr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWLRoot","type":"bytes32"}],"name":"setWLRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c0604052600060018190556008819055600b55610d05600c819055600d556014600e556003600f819055601055601580546001600160a01b03199081167316364a6b7ac1d7085346ce6a144a1fd35ba8087117909155601680548216734b0a54d5529d34352048022a6e67bb6a26d91a7a17905560178054821673977ee6f3c17ecb90ac5504ad92240d40a33ba12917905560188054821673aa15cf63a4852c5fb1614c4bfcfdc032b4e33d9817905560198054909116735350303b367fea34bfb85fd0da683ea9d8ebd550179055348015620000dc57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020016b27b83a34a9ba34b1b5b6b0b760a11b815250604051806040016040528060038152602001624f534360e81b815250600e54600c54620001556200014f6200039f60201b60201c565b620003a3565b60008111620001c25760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002245760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001b9565b600262000232858262000498565b50600362000241848262000498565b5060a09190915260805250506daaeb6d7670e522a718067333cd4e3b1562000392578015620002e057604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620002c157600080fd5b505af1158015620002d6573d6000803e3d6000fd5b5050505062000392565b6001600160a01b03821615620003315760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620002a6565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200037857600080fd5b505af11580156200038d573d6000803e3d6000fd5b505050505b5050600160095562000564565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200041e57607f821691505b6020821081036200043f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200049357600081815260208120601f850160051c810160208610156200046e5750805b601f850160051c820191505b818110156200048f578281556001016200047a565b5050505b505050565b81516001600160401b03811115620004b457620004b4620003f3565b620004cc81620004c5845462000409565b8462000445565b602080601f831160018114620005045760008415620004eb5750858301515b600019600386901b1c1916600185901b1785556200048f565b600085815260208120601f198616915b82811015620005355788860151825594840194600190910190840162000514565b5085821015620005545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05161319a6200059560003960008181611d4801528181611d72015261260a01526000505061319a6000f3fe6080604052600436106102765760003560e01c8063715018a61161014f578063aff048b7116100c1578063d7224ba01161007a578063d7224ba01461075d578063dc33e68114610773578063e985e9c514610793578063f2fde38b146107dc578063f4a0a528146107fc578063f81420ec1461081c57600080fd5b8063aff048b7146106b1578063b11c7f82146106d1578063b88d4fde146106f1578063c87b56dd14610711578063c9ed44ea14610731578063cfe1908d1461074757600080fd5b80639f68ae76116101135780639f68ae76146105e0578063a06c03ec14610600578063a213b17814610649578063a22cb46514610669578063ac44600214610689578063aca8ffe71461069157600080fd5b8063715018a61461056f5780638da5cb5b1461058457806395d89b41146105a257806397f06278146105b75780639884b5bf146105cd57600080fd5b8063324c6adc116101e85780634f6ccce7116101ac5780634f6ccce7146104c357806355f804b3146104e35780636352211e1461050357806366cc5f0d146105235780636817c76c1461053957806370a082311461054f57600080fd5b8063324c6adc1461043a5780633e9e834b1461045a5780633ffde1731461047a57806342842e0e146104905780634d10b546146104b057600080fd5b806318160ddd1161023a57806318160ddd1461038f57806323a47023146103a457806323b872dd146103ba5780632cc82655146103da5780632f745c59146103fa578063300b23d81461041a57600080fd5b806301ffc9a7146102ba57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806317881cbf1461036b57600080fd5b366102b557604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102c657600080fd5b506102da6102d53660046129b7565b610832565b60405190151581526020015b60405180910390f35b3480156102fb57600080fd5b5061030461089f565b6040516102e69190612a24565b34801561031d57600080fd5b5061033161032c366004612a37565b610931565b6040516001600160a01b0390911681526020016102e6565b34801561035557600080fd5b50610369610364366004612a6c565b6109c1565b005b34801561037757600080fd5b50610381600a5481565b6040519081526020016102e6565b34801561039b57600080fd5b50600154610381565b3480156103b057600080fd5b50610381600c5481565b3480156103c657600080fd5b506103696103d5366004612a96565b610a8a565b3480156103e657600080fd5b506103696103f5366004612a37565b610b63565b34801561040657600080fd5b50610381610415366004612a6c565b610b92565b34801561042657600080fd5b50610369610435366004612a37565b610d08565b34801561044657600080fd5b50610369610455366004612a6c565b610d37565b34801561046657600080fd5b50610369610475366004612a37565b610de5565b34801561048657600080fd5b5061038160115481565b34801561049c57600080fd5b506103696104ab366004612a96565b610e14565b6103696104be366004612b97565b610ee2565b3480156104cf57600080fd5b506103816104de366004612a37565b611138565b3480156104ef57600080fd5b506103696104fe366004612c34565b6111a1565b34801561050f57600080fd5b5061033161051e366004612a37565b6111d7565b34801561052f57600080fd5b50610381600f5481565b34801561054557600080fd5b50610381600b5481565b34801561055b57600080fd5b5061038161056a366004612c7c565b6111e9565b34801561057b57600080fd5b5061036961127a565b34801561059057600080fd5b506000546001600160a01b0316610331565b3480156105ae57600080fd5b506103046112b0565b3480156105c357600080fd5b50610381600d5481565b6103696105db366004612c97565b6112bf565b3480156105ec57600080fd5b506103696105fb366004612a37565b61150f565b34801561060c57600080fd5b5061063461061b366004612c7c565b6014602052600090815260409020805460019091015482565b604080519283526020830191909152016102e6565b34801561065557600080fd5b50610369610664366004612a37565b61153e565b34801561067557600080fd5b50610369610684366004612cf4565b61156d565b610369611631565b34801561069d57600080fd5b506103696106ac366004612a37565b611853565b3480156106bd57600080fd5b506103696106cc366004612a37565b611882565b3480156106dd57600080fd5b506103696106ec366004612a37565b6118b1565b3480156106fd57600080fd5b5061036961070c366004612d2b565b6118e0565b34801561071d57600080fd5b5061030461072c366004612a37565b6119bc565b34801561073d57600080fd5b5061038160125481565b34801561075357600080fd5b5061038160105481565b34801561076957600080fd5b5061038160085481565b34801561077f57600080fd5b5061038161078e366004612c7c565b611a89565b34801561079f57600080fd5b506102da6107ae366004612da6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107e857600080fd5b506103696107f7366004612c7c565b611a94565b34801561080857600080fd5b50610369610817366004612a37565b611b2f565b34801561082857600080fd5b50610381600e5481565b60006001600160e01b031982166380ac58cd60e01b148061086357506001600160e01b03198216635b5e139f60e01b145b8061087e57506001600160e01b0319821663780e9d6360e01b145b8061089957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108ae90612dd9565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90612dd9565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093e826001541190565b6109a55760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610a7b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a539190612e13565b610a7b57604051633b79c77360e21b81526001600160a01b038216600482015260240161099c565b610a858383611b5e565b505050565b826daaeb6d7670e522a718067333cd4e3b15610b5257336001600160a01b03821603610ac057610abb848484611c70565b610b5d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b339190612e13565b610b5257604051633b79c77360e21b815233600482015260240161099c565b610b5d848484611c70565b50505050565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161099c90612e30565b600a55565b6000610b9d836111e9565b8210610bf65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161099c565b6000610c0160015490565b905060008060005b83811015610ca8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c5b57805192505b876001600160a01b0316836001600160a01b031603610c9557868403610c875750935061089992505050565b83610c9181612e7b565b9450505b5080610ca081612e7b565b915050610c09565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161099c565b6000546001600160a01b03163314610d325760405162461bcd60e51b815260040161099c90612e30565b600e55565b6000546001600160a01b03163314610d615760405162461bcd60e51b815260040161099c90612e30565b600c5481610d6e60015490565b610d789190612e94565b1115610dd75760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c656374604482015267696f6e2073697a6560c01b606482015260840161099c565b610de18282611c7b565b5050565b6000546001600160a01b03163314610e0f5760405162461bcd60e51b815260040161099c90612e30565b600d55565b826daaeb6d7670e522a718067333cd4e3b15610ed757336001600160a01b03821603610e4557610abb848484611c95565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190612e13565b610ed757604051633b79c77360e21b815233600482015260240161099c565b610b5d848484611c95565b600a54600114610f345760405162461bcd60e51b815260206004820152601f60248201527f57686974656c69737420726f756e64206861736e2774206f70656e2079657400604482015260640161099c565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f7a8260115483611cb0565b610fbe5760405162461bcd60e51b81526020600482015260156024820152742cb7ba93b932903737ba103bb434ba32b634b9ba1760591b604482015260640161099c565b600d5483610fcb60015490565b610fd59190612e94565b11156110235760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161099c565b600f5433600090815260146020526040902054611041908590612e94565b11156110a85760405162461bcd60e51b815260206004820152603060248201527f4d617820706572206164647265737320666f722077686974656c6973742e205060448201526f3632b0b9b2903a393c903637bbb2b91760811b606482015260840161099c565b3483600b546110b79190612ea7565b11156111055760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099c565b61110f3384611c7b565b336000908152601460205260408120805485929061112e908490612e94565b9091555050505050565b600061114360015490565b821061119d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161099c565b5090565b6000546001600160a01b031633146111cb5760405162461bcd60e51b815260040161099c90612e30565b6013610de18282612f04565b60006111e282611cc6565b5192915050565b60006001600160a01b0382166112555760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161099c565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112a45760405162461bcd60e51b815260040161099c90612e30565b6112ae6000611e6f565b565b6060600380546108ae90612dd9565b32331461130e5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161099c565b600a546005146113605760405162461bcd60e51b815260206004820152601c60248201527f7075626c69632073616c65206861736e277420626567756e2079657400000000604482015260640161099c565b61136d8260125483611cb0565b6113c45760405162461bcd60e51b815260206004820152602260248201527f596f752063616e2774206d696e742066726f6d20536d617274436f6e747261636044820152613a1760f11b606482015260840161099c565b600c54836113d160015490565b6113db9190612e94565b111561141e5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161099c565b6010543360009081526014602052604090206001015461143f908590612e94565b11156114865760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161099c565b82600b546114949190612ea7565b3410156114e35760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161099c565b6114ed3384611c7b565b336000908152601460205260408120600101805485929061112e908490612e94565b6000546001600160a01b031633146115395760405162461bcd60e51b815260040161099c90612e30565b601055565b6000546001600160a01b031633146115685760405162461bcd60e51b815260040161099c90612e30565b601255565b816daaeb6d7670e522a718067333cd4e3b1561162757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff9190612e13565b61162757604051633b79c77360e21b81526001600160a01b038216600482015260240161099c565b610a858383611ebf565b6002600954036116835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161099c565b600260095560006064611697476032612ea7565b6116a19190612fd9565b9050600060646116b247600f612ea7565b6116bc9190612fd9565b9050600060646116cd47600f612ea7565b6116d79190612fd9565b9050600060646116e847600f612ea7565b6116f29190612fd9565b905060006064611703476005612ea7565b61170d9190612fd9565b90506000471161174d5760405162461bcd60e51b815260206004820152600b60248201526a139bc8115512081b19599d60aa1b604482015260640161099c565b6015546040516001600160a01b039091169086156108fc029087906000818181858888f1935050505061177f57600080fd5b6016546040516001600160a01b039091169085156108fc029086906000818181858888f193505050506117b157600080fd5b6017546040516001600160a01b039091169084156108fc029085906000818181858888f193505050506117e357600080fd5b6018546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505061181557600080fd5b6019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061184757600080fd5b50506001600955505050565b6000546001600160a01b0316331461187d5760405162461bcd60e51b815260040161099c90612e30565b600c55565b6000546001600160a01b031633146118ac5760405162461bcd60e51b815260040161099c90612e30565b600f55565b6000546001600160a01b031633146118db5760405162461bcd60e51b815260040161099c90612e30565b601155565b836daaeb6d7670e522a718067333cd4e3b156119a957336001600160a01b038216036119175761191285858585611f83565b6119b5565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190612e13565b6119a957604051633b79c77360e21b815233600482015260240161099c565b6119b585858585611f83565b5050505050565b60606119c9826001541190565b611a2d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161099c565b6000611a37611fb6565b90506000815111611a575760405180602001604052806000815250611a82565b80611a6184611fc5565b604051602001611a72929190612fed565b6040516020818303038152906040525b9392505050565b6000610899826120cd565b6000546001600160a01b03163314611abe5760405162461bcd60e51b815260040161099c90612e30565b6001600160a01b038116611b235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099c565b611b2c81611e6f565b50565b6000546001600160a01b03163314611b595760405162461bcd60e51b815260040161099c90612e30565b600b55565b6000611b69826111d7565b9050806001600160a01b0316836001600160a01b031603611bd75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161099c565b336001600160a01b0382161480611bf35750611bf381336107ae565b611c655760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161099c565b610a8583838361216b565b610a858383836121c7565b610de182826040518060200160405280600081525061254d565b610a85838383604051806020016040528060008152506118e0565b600082611cbd8584612827565b14949350505050565b6040805180820190915260008082526020820152611ce5826001541190565b611d445760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161099c565b60007f00000000000000000000000000000000000000000000000000000000000000008310611da557611d977f00000000000000000000000000000000000000000000000000000000000000008461301c565b611da2906001612e94565b90505b825b818110611e0e576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611dfb57949350505050565b5080611e068161302f565b915050611da7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161099c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b03831603611f175760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161099c565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f8e8484846121c7565b611f9a84848484612874565b610b5d5760405162461bcd60e51b815260040161099c90613046565b6060601380546108ae90612dd9565b606081600003611fec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612016578061200081612e7b565b915061200f9050600a83612fd9565b9150611ff0565b6000816001600160401b0381111561203057612030612ad2565b6040519080825280601f01601f19166020018201604052801561205a576020820181803683370190505b5090505b84156120c55761206f60018361301c565b915061207c600a86613099565b612087906030612e94565b60f81b81838151811061209c5761209c6130ad565b60200101906001600160f81b031916908160001a9053506120be600a86612fd9565b945061205e565b949350505050565b60006001600160a01b03821661213f5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161099c565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121d282611cc6565b80519091506000906001600160a01b0316336001600160a01b031614806122095750336121fe84610931565b6001600160a01b0316145b8061221b5750815161221b90336107ae565b9050806122855760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161099c565b846001600160a01b031682600001516001600160a01b0316146122f95760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161099c565b6001600160a01b03841661235d5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161099c565b61236d600084846000015161216b565b6001600160a01b038516600090815260056020526040812080546001929061239f9084906001600160801b03166130c3565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260056020526040812080546001945090926123eb918591166130ea565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612472846001612e94565b6000818152600460205260409020549091506001600160a01b03166125035761249c816001541190565b156125035760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6001546001600160a01b0384166125b05760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161099c565b6125bb816001541190565b156126085760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161099c565b7f00000000000000000000000000000000000000000000000000000000000000008311156126835760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161099c565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906126df9087906130ea565b6001600160801b031681526020018583602001516126fd91906130ea565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561281c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127e06000888488612874565b6127fc5760405162461bcd60e51b815260040161099c90613046565b8161280681612e7b565b925050808061281490612e7b565b915050612793565b506001819055612545565b600081815b845181101561286c576128588286838151811061284b5761284b6130ad565b6020026020010151612975565b91508061286481612e7b565b91505061282c565b509392505050565b60006001600160a01b0384163b1561296a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906128b890339089908890889060040161310a565b6020604051808303816000875af19250505080156128f3575060408051601f3d908101601f191682019092526128f091810190613147565b60015b612950573d808015612921576040519150601f19603f3d011682016040523d82523d6000602084013e612926565b606091505b5080516000036129485760405162461bcd60e51b815260040161099c90613046565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120c5565b506001949350505050565b6000818310612991576000828152602084905260409020611a82565b5060009182526020526040902090565b6001600160e01b031981168114611b2c57600080fd5b6000602082840312156129c957600080fd5b8135611a82816129a1565b60005b838110156129ef5781810151838201526020016129d7565b50506000910152565b60008151808452612a108160208601602086016129d4565b601f01601f19169290920160200192915050565b602081526000611a8260208301846129f8565b600060208284031215612a4957600080fd5b5035919050565b80356001600160a01b0381168114612a6757600080fd5b919050565b60008060408385031215612a7f57600080fd5b612a8883612a50565b946020939093013593505050565b600080600060608486031215612aab57600080fd5b612ab484612a50565b9250612ac260208501612a50565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612b1057612b10612ad2565b604052919050565b600082601f830112612b2957600080fd5b813560206001600160401b03821115612b4457612b44612ad2565b8160051b612b53828201612ae8565b9283528481018201928281019087851115612b6d57600080fd5b83870192505b84831015612b8c57823582529183019190830190612b73565b979650505050505050565b60008060408385031215612baa57600080fd5b8235915060208301356001600160401b03811115612bc757600080fd5b612bd385828601612b18565b9150509250929050565b60006001600160401b03831115612bf657612bf6612ad2565b612c09601f8401601f1916602001612ae8565b9050828152838383011115612c1d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612c4657600080fd5b81356001600160401b03811115612c5c57600080fd5b8201601f81018413612c6d57600080fd5b6120c584823560208401612bdd565b600060208284031215612c8e57600080fd5b611a8282612a50565b600080600060608486031215612cac57600080fd5b8335925060208401356001600160401b03811115612cc957600080fd5b612cd586828701612b18565b925050604084013590509250925092565b8015158114611b2c57600080fd5b60008060408385031215612d0757600080fd5b612d1083612a50565b91506020830135612d2081612ce6565b809150509250929050565b60008060008060808587031215612d4157600080fd5b612d4a85612a50565b9350612d5860208601612a50565b92506040850135915060608501356001600160401b03811115612d7a57600080fd5b8501601f81018713612d8b57600080fd5b612d9a87823560208401612bdd565b91505092959194509250565b60008060408385031215612db957600080fd5b612dc283612a50565b9150612dd060208401612a50565b90509250929050565b600181811c90821680612ded57607f821691505b602082108103612e0d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e2557600080fd5b8151611a8281612ce6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201612e8d57612e8d612e65565b5060010190565b8082018082111561089957610899612e65565b808202811582820484141761089957610899612e65565b601f821115610a8557600081815260208120601f850160051c81016020861015612ee55750805b601f850160051c820191505b8181101561254557828155600101612ef1565b81516001600160401b03811115612f1d57612f1d612ad2565b612f3181612f2b8454612dd9565b84612ebe565b602080601f831160018114612f665760008415612f4e5750858301515b600019600386901b1c1916600185901b178555612545565b600085815260208120601f198616915b82811015612f9557888601518255948401946001909101908401612f76565b5085821015612fb35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082612fe857612fe8612fc3565b500490565b60008351612fff8184602088016129d4565b8351908301906130138183602088016129d4565b01949350505050565b8181038181111561089957610899612e65565b60008161303e5761303e612e65565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000826130a8576130a8612fc3565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160801b038281168282160390808211156130e3576130e3612e65565b5092915050565b6001600160801b038181168382160190808211156130e3576130e3612e65565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061313d908301846129f8565b9695505050505050565b60006020828403121561315957600080fd5b8151611a82816129a156fea26469706673582212209a7420052a0a4924090552eff1423dce95c58253deb854fd1794ee88878f6b4d64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102765760003560e01c8063715018a61161014f578063aff048b7116100c1578063d7224ba01161007a578063d7224ba01461075d578063dc33e68114610773578063e985e9c514610793578063f2fde38b146107dc578063f4a0a528146107fc578063f81420ec1461081c57600080fd5b8063aff048b7146106b1578063b11c7f82146106d1578063b88d4fde146106f1578063c87b56dd14610711578063c9ed44ea14610731578063cfe1908d1461074757600080fd5b80639f68ae76116101135780639f68ae76146105e0578063a06c03ec14610600578063a213b17814610649578063a22cb46514610669578063ac44600214610689578063aca8ffe71461069157600080fd5b8063715018a61461056f5780638da5cb5b1461058457806395d89b41146105a257806397f06278146105b75780639884b5bf146105cd57600080fd5b8063324c6adc116101e85780634f6ccce7116101ac5780634f6ccce7146104c357806355f804b3146104e35780636352211e1461050357806366cc5f0d146105235780636817c76c1461053957806370a082311461054f57600080fd5b8063324c6adc1461043a5780633e9e834b1461045a5780633ffde1731461047a57806342842e0e146104905780634d10b546146104b057600080fd5b806318160ddd1161023a57806318160ddd1461038f57806323a47023146103a457806323b872dd146103ba5780632cc82655146103da5780632f745c59146103fa578063300b23d81461041a57600080fd5b806301ffc9a7146102ba57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806317881cbf1461036b57600080fd5b366102b557604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102c657600080fd5b506102da6102d53660046129b7565b610832565b60405190151581526020015b60405180910390f35b3480156102fb57600080fd5b5061030461089f565b6040516102e69190612a24565b34801561031d57600080fd5b5061033161032c366004612a37565b610931565b6040516001600160a01b0390911681526020016102e6565b34801561035557600080fd5b50610369610364366004612a6c565b6109c1565b005b34801561037757600080fd5b50610381600a5481565b6040519081526020016102e6565b34801561039b57600080fd5b50600154610381565b3480156103b057600080fd5b50610381600c5481565b3480156103c657600080fd5b506103696103d5366004612a96565b610a8a565b3480156103e657600080fd5b506103696103f5366004612a37565b610b63565b34801561040657600080fd5b50610381610415366004612a6c565b610b92565b34801561042657600080fd5b50610369610435366004612a37565b610d08565b34801561044657600080fd5b50610369610455366004612a6c565b610d37565b34801561046657600080fd5b50610369610475366004612a37565b610de5565b34801561048657600080fd5b5061038160115481565b34801561049c57600080fd5b506103696104ab366004612a96565b610e14565b6103696104be366004612b97565b610ee2565b3480156104cf57600080fd5b506103816104de366004612a37565b611138565b3480156104ef57600080fd5b506103696104fe366004612c34565b6111a1565b34801561050f57600080fd5b5061033161051e366004612a37565b6111d7565b34801561052f57600080fd5b50610381600f5481565b34801561054557600080fd5b50610381600b5481565b34801561055b57600080fd5b5061038161056a366004612c7c565b6111e9565b34801561057b57600080fd5b5061036961127a565b34801561059057600080fd5b506000546001600160a01b0316610331565b3480156105ae57600080fd5b506103046112b0565b3480156105c357600080fd5b50610381600d5481565b6103696105db366004612c97565b6112bf565b3480156105ec57600080fd5b506103696105fb366004612a37565b61150f565b34801561060c57600080fd5b5061063461061b366004612c7c565b6014602052600090815260409020805460019091015482565b604080519283526020830191909152016102e6565b34801561065557600080fd5b50610369610664366004612a37565b61153e565b34801561067557600080fd5b50610369610684366004612cf4565b61156d565b610369611631565b34801561069d57600080fd5b506103696106ac366004612a37565b611853565b3480156106bd57600080fd5b506103696106cc366004612a37565b611882565b3480156106dd57600080fd5b506103696106ec366004612a37565b6118b1565b3480156106fd57600080fd5b5061036961070c366004612d2b565b6118e0565b34801561071d57600080fd5b5061030461072c366004612a37565b6119bc565b34801561073d57600080fd5b5061038160125481565b34801561075357600080fd5b5061038160105481565b34801561076957600080fd5b5061038160085481565b34801561077f57600080fd5b5061038161078e366004612c7c565b611a89565b34801561079f57600080fd5b506102da6107ae366004612da6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107e857600080fd5b506103696107f7366004612c7c565b611a94565b34801561080857600080fd5b50610369610817366004612a37565b611b2f565b34801561082857600080fd5b50610381600e5481565b60006001600160e01b031982166380ac58cd60e01b148061086357506001600160e01b03198216635b5e139f60e01b145b8061087e57506001600160e01b0319821663780e9d6360e01b145b8061089957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108ae90612dd9565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90612dd9565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093e826001541190565b6109a55760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610a7b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a539190612e13565b610a7b57604051633b79c77360e21b81526001600160a01b038216600482015260240161099c565b610a858383611b5e565b505050565b826daaeb6d7670e522a718067333cd4e3b15610b5257336001600160a01b03821603610ac057610abb848484611c70565b610b5d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b339190612e13565b610b5257604051633b79c77360e21b815233600482015260240161099c565b610b5d848484611c70565b50505050565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161099c90612e30565b600a55565b6000610b9d836111e9565b8210610bf65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161099c565b6000610c0160015490565b905060008060005b83811015610ca8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c5b57805192505b876001600160a01b0316836001600160a01b031603610c9557868403610c875750935061089992505050565b83610c9181612e7b565b9450505b5080610ca081612e7b565b915050610c09565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161099c565b6000546001600160a01b03163314610d325760405162461bcd60e51b815260040161099c90612e30565b600e55565b6000546001600160a01b03163314610d615760405162461bcd60e51b815260040161099c90612e30565b600c5481610d6e60015490565b610d789190612e94565b1115610dd75760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c656374604482015267696f6e2073697a6560c01b606482015260840161099c565b610de18282611c7b565b5050565b6000546001600160a01b03163314610e0f5760405162461bcd60e51b815260040161099c90612e30565b600d55565b826daaeb6d7670e522a718067333cd4e3b15610ed757336001600160a01b03821603610e4557610abb848484611c95565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190612e13565b610ed757604051633b79c77360e21b815233600482015260240161099c565b610b5d848484611c95565b600a54600114610f345760405162461bcd60e51b815260206004820152601f60248201527f57686974656c69737420726f756e64206861736e2774206f70656e2079657400604482015260640161099c565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f7a8260115483611cb0565b610fbe5760405162461bcd60e51b81526020600482015260156024820152742cb7ba93b932903737ba103bb434ba32b634b9ba1760591b604482015260640161099c565b600d5483610fcb60015490565b610fd59190612e94565b11156110235760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161099c565b600f5433600090815260146020526040902054611041908590612e94565b11156110a85760405162461bcd60e51b815260206004820152603060248201527f4d617820706572206164647265737320666f722077686974656c6973742e205060448201526f3632b0b9b2903a393c903637bbb2b91760811b606482015260840161099c565b3483600b546110b79190612ea7565b11156111055760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099c565b61110f3384611c7b565b336000908152601460205260408120805485929061112e908490612e94565b9091555050505050565b600061114360015490565b821061119d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161099c565b5090565b6000546001600160a01b031633146111cb5760405162461bcd60e51b815260040161099c90612e30565b6013610de18282612f04565b60006111e282611cc6565b5192915050565b60006001600160a01b0382166112555760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161099c565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112a45760405162461bcd60e51b815260040161099c90612e30565b6112ae6000611e6f565b565b6060600380546108ae90612dd9565b32331461130e5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161099c565b600a546005146113605760405162461bcd60e51b815260206004820152601c60248201527f7075626c69632073616c65206861736e277420626567756e2079657400000000604482015260640161099c565b61136d8260125483611cb0565b6113c45760405162461bcd60e51b815260206004820152602260248201527f596f752063616e2774206d696e742066726f6d20536d617274436f6e747261636044820152613a1760f11b606482015260840161099c565b600c54836113d160015490565b6113db9190612e94565b111561141e5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161099c565b6010543360009081526014602052604090206001015461143f908590612e94565b11156114865760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161099c565b82600b546114949190612ea7565b3410156114e35760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161099c565b6114ed3384611c7b565b336000908152601460205260408120600101805485929061112e908490612e94565b6000546001600160a01b031633146115395760405162461bcd60e51b815260040161099c90612e30565b601055565b6000546001600160a01b031633146115685760405162461bcd60e51b815260040161099c90612e30565b601255565b816daaeb6d7670e522a718067333cd4e3b1561162757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff9190612e13565b61162757604051633b79c77360e21b81526001600160a01b038216600482015260240161099c565b610a858383611ebf565b6002600954036116835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161099c565b600260095560006064611697476032612ea7565b6116a19190612fd9565b9050600060646116b247600f612ea7565b6116bc9190612fd9565b9050600060646116cd47600f612ea7565b6116d79190612fd9565b9050600060646116e847600f612ea7565b6116f29190612fd9565b905060006064611703476005612ea7565b61170d9190612fd9565b90506000471161174d5760405162461bcd60e51b815260206004820152600b60248201526a139bc8115512081b19599d60aa1b604482015260640161099c565b6015546040516001600160a01b039091169086156108fc029087906000818181858888f1935050505061177f57600080fd5b6016546040516001600160a01b039091169085156108fc029086906000818181858888f193505050506117b157600080fd5b6017546040516001600160a01b039091169084156108fc029085906000818181858888f193505050506117e357600080fd5b6018546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505061181557600080fd5b6019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061184757600080fd5b50506001600955505050565b6000546001600160a01b0316331461187d5760405162461bcd60e51b815260040161099c90612e30565b600c55565b6000546001600160a01b031633146118ac5760405162461bcd60e51b815260040161099c90612e30565b600f55565b6000546001600160a01b031633146118db5760405162461bcd60e51b815260040161099c90612e30565b601155565b836daaeb6d7670e522a718067333cd4e3b156119a957336001600160a01b038216036119175761191285858585611f83565b6119b5565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190612e13565b6119a957604051633b79c77360e21b815233600482015260240161099c565b6119b585858585611f83565b5050505050565b60606119c9826001541190565b611a2d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161099c565b6000611a37611fb6565b90506000815111611a575760405180602001604052806000815250611a82565b80611a6184611fc5565b604051602001611a72929190612fed565b6040516020818303038152906040525b9392505050565b6000610899826120cd565b6000546001600160a01b03163314611abe5760405162461bcd60e51b815260040161099c90612e30565b6001600160a01b038116611b235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099c565b611b2c81611e6f565b50565b6000546001600160a01b03163314611b595760405162461bcd60e51b815260040161099c90612e30565b600b55565b6000611b69826111d7565b9050806001600160a01b0316836001600160a01b031603611bd75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161099c565b336001600160a01b0382161480611bf35750611bf381336107ae565b611c655760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161099c565b610a8583838361216b565b610a858383836121c7565b610de182826040518060200160405280600081525061254d565b610a85838383604051806020016040528060008152506118e0565b600082611cbd8584612827565b14949350505050565b6040805180820190915260008082526020820152611ce5826001541190565b611d445760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161099c565b60007f00000000000000000000000000000000000000000000000000000000000000148310611da557611d977f00000000000000000000000000000000000000000000000000000000000000148461301c565b611da2906001612e94565b90505b825b818110611e0e576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611dfb57949350505050565b5080611e068161302f565b915050611da7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161099c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b03831603611f175760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161099c565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f8e8484846121c7565b611f9a84848484612874565b610b5d5760405162461bcd60e51b815260040161099c90613046565b6060601380546108ae90612dd9565b606081600003611fec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612016578061200081612e7b565b915061200f9050600a83612fd9565b9150611ff0565b6000816001600160401b0381111561203057612030612ad2565b6040519080825280601f01601f19166020018201604052801561205a576020820181803683370190505b5090505b84156120c55761206f60018361301c565b915061207c600a86613099565b612087906030612e94565b60f81b81838151811061209c5761209c6130ad565b60200101906001600160f81b031916908160001a9053506120be600a86612fd9565b945061205e565b949350505050565b60006001600160a01b03821661213f5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161099c565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121d282611cc6565b80519091506000906001600160a01b0316336001600160a01b031614806122095750336121fe84610931565b6001600160a01b0316145b8061221b5750815161221b90336107ae565b9050806122855760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161099c565b846001600160a01b031682600001516001600160a01b0316146122f95760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161099c565b6001600160a01b03841661235d5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161099c565b61236d600084846000015161216b565b6001600160a01b038516600090815260056020526040812080546001929061239f9084906001600160801b03166130c3565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260056020526040812080546001945090926123eb918591166130ea565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612472846001612e94565b6000818152600460205260409020549091506001600160a01b03166125035761249c816001541190565b156125035760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6001546001600160a01b0384166125b05760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161099c565b6125bb816001541190565b156126085760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161099c565b7f00000000000000000000000000000000000000000000000000000000000000148311156126835760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161099c565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906126df9087906130ea565b6001600160801b031681526020018583602001516126fd91906130ea565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561281c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127e06000888488612874565b6127fc5760405162461bcd60e51b815260040161099c90613046565b8161280681612e7b565b925050808061281490612e7b565b915050612793565b506001819055612545565b600081815b845181101561286c576128588286838151811061284b5761284b6130ad565b6020026020010151612975565b91508061286481612e7b565b91505061282c565b509392505050565b60006001600160a01b0384163b1561296a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906128b890339089908890889060040161310a565b6020604051808303816000875af19250505080156128f3575060408051601f3d908101601f191682019092526128f091810190613147565b60015b612950573d808015612921576040519150601f19603f3d011682016040523d82523d6000602084013e612926565b606091505b5080516000036129485760405162461bcd60e51b815260040161099c90613046565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120c5565b506001949350505050565b6000818310612991576000828152602084905260409020611a82565b5060009182526020526040902090565b6001600160e01b031981168114611b2c57600080fd5b6000602082840312156129c957600080fd5b8135611a82816129a1565b60005b838110156129ef5781810151838201526020016129d7565b50506000910152565b60008151808452612a108160208601602086016129d4565b601f01601f19169290920160200192915050565b602081526000611a8260208301846129f8565b600060208284031215612a4957600080fd5b5035919050565b80356001600160a01b0381168114612a6757600080fd5b919050565b60008060408385031215612a7f57600080fd5b612a8883612a50565b946020939093013593505050565b600080600060608486031215612aab57600080fd5b612ab484612a50565b9250612ac260208501612a50565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612b1057612b10612ad2565b604052919050565b600082601f830112612b2957600080fd5b813560206001600160401b03821115612b4457612b44612ad2565b8160051b612b53828201612ae8565b9283528481018201928281019087851115612b6d57600080fd5b83870192505b84831015612b8c57823582529183019190830190612b73565b979650505050505050565b60008060408385031215612baa57600080fd5b8235915060208301356001600160401b03811115612bc757600080fd5b612bd385828601612b18565b9150509250929050565b60006001600160401b03831115612bf657612bf6612ad2565b612c09601f8401601f1916602001612ae8565b9050828152838383011115612c1d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612c4657600080fd5b81356001600160401b03811115612c5c57600080fd5b8201601f81018413612c6d57600080fd5b6120c584823560208401612bdd565b600060208284031215612c8e57600080fd5b611a8282612a50565b600080600060608486031215612cac57600080fd5b8335925060208401356001600160401b03811115612cc957600080fd5b612cd586828701612b18565b925050604084013590509250925092565b8015158114611b2c57600080fd5b60008060408385031215612d0757600080fd5b612d1083612a50565b91506020830135612d2081612ce6565b809150509250929050565b60008060008060808587031215612d4157600080fd5b612d4a85612a50565b9350612d5860208601612a50565b92506040850135915060608501356001600160401b03811115612d7a57600080fd5b8501601f81018713612d8b57600080fd5b612d9a87823560208401612bdd565b91505092959194509250565b60008060408385031215612db957600080fd5b612dc283612a50565b9150612dd060208401612a50565b90509250929050565b600181811c90821680612ded57607f821691505b602082108103612e0d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e2557600080fd5b8151611a8281612ce6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201612e8d57612e8d612e65565b5060010190565b8082018082111561089957610899612e65565b808202811582820484141761089957610899612e65565b601f821115610a8557600081815260208120601f850160051c81016020861015612ee55750805b601f850160051c820191505b8181101561254557828155600101612ef1565b81516001600160401b03811115612f1d57612f1d612ad2565b612f3181612f2b8454612dd9565b84612ebe565b602080601f831160018114612f665760008415612f4e5750858301515b600019600386901b1c1916600185901b178555612545565b600085815260208120601f198616915b82811015612f9557888601518255948401946001909101908401612f76565b5085821015612fb35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082612fe857612fe8612fc3565b500490565b60008351612fff8184602088016129d4565b8351908301906130138183602088016129d4565b01949350505050565b8181038181111561089957610899612e65565b60008161303e5761303e612e65565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000826130a8576130a8612fc3565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160801b038281168282160390808211156130e3576130e3612e65565b5092915050565b6001600160801b038181168382160190808211156130e3576130e3612e65565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061313d908301846129f8565b9695505050505050565b60006020828403121561315957600080fd5b8151611a82816129a156fea26469706673582212209a7420052a0a4924090552eff1423dce95c58253deb854fd1794ee88878f6b4d64736f6c63430008110033
Deployed Bytecode Sourcemap
52321:7338:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58517:31;;;58526:10;188:51:1;;58538:9:0;270:2:1;255:18;;248:34;58517:31:0;;161:18:1;58517:31:0;;;;;;;52321:7338;;;;;37620:370;;;;;;;;;;-1:-1:-1;37620:370:0;;;;;:::i;:::-;;:::i;:::-;;;844:14:1;;837:22;819:41;;807:2;792:18;37620:370:0;;;;;;;;39346:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40879:212::-;;;;;;;;;;-1:-1:-1;40879:212:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1976:32:1;;;1958:51;;1946:2;1931:18;40879:212:0;1812:203:1;58860:157:0;;;;;;;;;;-1:-1:-1;58860:157:0;;;;;:::i;:::-;;:::i;:::-;;52443:24;;;;;;;;;;;;;;;;;;;2603:25:1;;;2591:2;2576:18;52443:24:0;2457:177:1;36181:94:0;;;;;;;;;;-1:-1:-1;36257:12:0;;36181:94;;52520:37;;;;;;;;;;;;;;;;59025:163;;;;;;;;;;-1:-1:-1;59025:163:0;;;;;:::i;:::-;;:::i;54543:94::-;;;;;;;;;;-1:-1:-1;54543:94:0;;;;;:::i;:::-;;:::i;36812:744::-;;;;;;;;;;-1:-1:-1;36812:744:0;;;;;:::i;:::-;;:::i;53612:97::-;;;;;;;;;;-1:-1:-1;53612:97:0;;;;;:::i;:::-;;:::i;54777:231::-;;;;;;;;;;-1:-1:-1;54777:231:0;;;;;:::i;:::-;;:::i;53966:110::-;;;;;;;;;;-1:-1:-1;53966:110:0;;;;;:::i;:::-;;:::i;52785:21::-;;;;;;;;;;;;;;;;59196:171;;;;;;;;;;-1:-1:-1;59196:171:0;;;;;:::i;:::-;;:::i;55088:809::-;;;;;;:::i;:::-;;:::i;36344:177::-;;;;;;;;;;-1:-1:-1;36344:177:0;;;;;:::i;:::-;;:::i;53412:105::-;;;;;;;;;;-1:-1:-1;53412:105:0;;;;;:::i;:::-;;:::i;39169:118::-;;;;;;;;;;-1:-1:-1;39169:118:0;;;;;:::i;:::-;;:::i;52704:34::-;;;;;;;;;;;;;;;;52477;;;;;;;;;;;;;;;;38046:211;;;;;;;;;;-1:-1:-1;38046:211:0;;;;;:::i;:::-;;:::i;51598:94::-;;;;;;;;;;;;;:::i;50947:87::-;;;;;;;;;;-1:-1:-1;50993:7:0;51020:6;-1:-1:-1;;;;;51020:6:0;50947:87;;39501:98;;;;;;;;;;;;;:::i;52565:33::-;;;;;;;;;;;;;;;;55982:800;;;;;;:::i;:::-;;:::i;54084:118::-;;;;;;;;;;-1:-1:-1;54084:118:0;;;;;:::i;:::-;;:::i;52972:55::-;;;;;;;;;;-1:-1:-1;52972:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;6426:25:1;;;6482:2;6467:18;;6460:34;;;;6399:18;52972:55:0;6252:248:1;54450:85:0;;;;;;;;;;-1:-1:-1;54450:85:0;;;;;:::i;:::-;;:::i;58676:176::-;;;;;;;;;;-1:-1:-1;58676:176:0;;;;;:::i;:::-;;:::i;57620:730::-;;;:::i;53831:127::-;;;;;;;;;;-1:-1:-1;53831:127:0;;;;;:::i;:::-;;:::i;54210:130::-;;;;;;;;;;-1:-1:-1;54210:130:0;;;;;:::i;:::-;;:::i;54348:94::-;;;;;;;;;;-1:-1:-1;54348:94:0;;;;;:::i;:::-;;:::i;59375:228::-;;;;;;;;;;-1:-1:-1;59375:228:0;;;;;:::i;:::-;;:::i;39662:394::-;;;;;;;;;;-1:-1:-1;39662:394:0;;;;;:::i;:::-;;:::i;52814:21::-;;;;;;;;;;;;;;;;52745:31;;;;;;;;;;;;;;;;46609:43;;;;;;;;;;;;;;;;56790:235;;;;;;;;;;-1:-1:-1;56790:235:0;;;;;:::i;:::-;;:::i;41500:186::-;;;;;;;;;;-1:-1:-1;41500:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;41645:25:0;;;41622:4;41645:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41500:186;51847:192;;;;;;;;;;-1:-1:-1;51847:192:0;;;;;:::i;:::-;;:::i;53721:98::-;;;;;;;;;;-1:-1:-1;53721:98:0;;;;;:::i;:::-;;:::i;52610:31::-;;;;;;;;;;;;;;;;37620:370;37747:4;-1:-1:-1;;;;;;37777:40:0;;-1:-1:-1;;;37777:40:0;;:99;;-1:-1:-1;;;;;;;37828:48:0;;-1:-1:-1;;;37828:48:0;37777:99;:160;;;-1:-1:-1;;;;;;;37887:50:0;;-1:-1:-1;;;37887:50:0;37777:160;:207;;;-1:-1:-1;;;;;;;;;;23913:40:0;;;37948:36;37763:221;37620:370;-1:-1:-1;;37620:370:0:o;39346:94::-;39400:13;39429:5;39422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39346:94;:::o;40879:212::-;40955:7;40979:16;40987:7;42831:12;;-1:-1:-1;42821:22:0;42744:105;40979:16;40971:74;;;;-1:-1:-1;;;40971:74:0;;8657:2:1;40971:74:0;;;8639:21:1;8696:2;8676:18;;;8669:30;8735:34;8715:18;;;8708:62;-1:-1:-1;;;8786:18:1;;;8779:43;8839:19;;40971:74:0;;;;;;;;;-1:-1:-1;41061:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41061:24:0;;40879:212::o;58860:157::-;58956:8;2679:42;4573:45;:49;4569:225;;4644:67;;-1:-1:-1;;;4644:67:0;;4695:4;4644:67;;;9081:34:1;-1:-1:-1;;;;;9151:15:1;;9131:18;;;9124:43;2679:42:0;;4644;;9016:18:1;;4644:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4639:144;;4739:28;;-1:-1:-1;;;4739:28:0;;-1:-1:-1;;;;;1976:32:1;;4739:28:0;;;1958:51:1;1931:18;;4739:28:0;1812:203:1;4639:144:0;58977:32:::1;58991:8;59001:7;58977:13;:32::i;:::-;58860:157:::0;;;:::o;59025:163::-;59126:4;2679:42;3827:45;:49;3823:539;;4116:10;-1:-1:-1;;;;;4108:18:0;;;4104:85;;59143:37:::1;59162:4;59168:2;59172:7;59143:18;:37::i;:::-;4167:7:::0;;4104:85;4208:69;;-1:-1:-1;;;4208:69:0;;4259:4;4208:69;;;9081:34:1;4266:10:0;9131:18:1;;;9124:43;2679:42:0;;4208;;9016:18:1;;4208:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4203:148;;4305:30;;-1:-1:-1;;;4305:30:0;;4324:10;4305:30;;;1958:51:1;1931:18;;4305:30:0;1812:203:1;4203:148:0;59143:37:::1;59162:4;59168:2;59172:7;59143:18;:37::i;:::-;59025:163:::0;;;;:::o;54543:94::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54608:9:::1;:20:::0;54543:94::o;36812:744::-;36921:7;36956:16;36966:5;36956:9;:16::i;:::-;36948:5;:24;36940:71;;;;-1:-1:-1;;;36940:71:0;;9991:2:1;36940:71:0;;;9973:21:1;10030:2;10010:18;;;10003:30;10069:34;10049:18;;;10042:62;-1:-1:-1;;;10120:18:1;;;10113:32;10162:19;;36940:71:0;9789:398:1;36940:71:0;37018:22;37043:13;36257:12;;;36181:94;37043:13;37018:38;;37063:19;37093:25;37143:9;37138:350;37162:14;37158:1;:18;37138:350;;;37192:31;37226:14;;;:11;:14;;;;;;;;;37192:48;;;;;;;;;-1:-1:-1;;;;;37192:48:0;;;;;-1:-1:-1;;;37192:48:0;;;-1:-1:-1;;;;;37192:48:0;;;;;;;;37253:28;37249:89;;37314:14;;;-1:-1:-1;37249:89:0;37371:5;-1:-1:-1;;;;;37350:26:0;:17;-1:-1:-1;;;;;37350:26:0;;37346:135;;37408:5;37393:11;:20;37389:59;;-1:-1:-1;37435:1:0;-1:-1:-1;37428:8:0;;-1:-1:-1;;;37428:8:0;37389:59;37458:13;;;;:::i;:::-;;;;37346:135;-1:-1:-1;37178:3:0;;;;:::i;:::-;;;;37138:350;;;-1:-1:-1;37494:56:0;;-1:-1:-1;;;37494:56:0;;10666:2:1;37494:56:0;;;10648:21:1;10705:2;10685:18;;;10678:30;10744:34;10724:18;;;10717:62;-1:-1:-1;;;10795:18:1;;;10788:44;10849:19;;37494:56:0;10464:410:1;53612:97:0;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;53679:11:::1;:21:::0;53612:97::o;54777:231::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54899:15:::1;;54884:11;54868:13;36257:12:::0;;;36181:94;54868:13:::1;:27;;;;:::i;:::-;:46;;54860:100;;;::::0;-1:-1:-1;;;54860:100:0;;11211:2:1;54860:100:0::1;::::0;::::1;11193:21:1::0;11250:2;11230:18;;;11223:30;11289:34;11269:18;;;11262:62;-1:-1:-1;;;11340:18:1;;;11333:38;11388:19;;54860:100:0::1;11009:404:1::0;54860:100:0::1;54973:27;54984:3;54988:11;54973:9;:27::i;:::-;54777:231:::0;;:::o;53966:110::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54041:10:::1;:26:::0;53966:110::o;59196:171::-;59301:4;2679:42;3827:45;:49;3823:539;;4116:10;-1:-1:-1;;;;;4108:18:0;;;4104:85;;59318:41:::1;59341:4;59347:2;59351:7;59318:22;:41::i;4104:85::-:0;4208:69;;-1:-1:-1;;;4208:69:0;;4259:4;4208:69;;;9081:34:1;4266:10:0;9131:18:1;;;9124:43;2679:42:0;;4208;;9016:18:1;;4208:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4203:148;;4305:30;;-1:-1:-1;;;4305:30:0;;4324:10;4305:30;;;1958:51:1;1931:18;;4305:30:0;1812:203:1;4203:148:0;59318:41:::1;59341:4;59347:2;59351:7;59318:22;:41::i;55088:809::-:0;55194:9;;55207:1;55194:14;55186:58;;;;-1:-1:-1;;;55186:58:0;;11620:2:1;55186:58:0;;;11602:21:1;11659:2;11639:18;;;11632:30;11698:33;11678:18;;;11671:61;11749:18;;55186:58:0;11418:355:1;55186:58:0;55282:28;;-1:-1:-1;;55299:10:0;11927:2:1;11923:15;11919:53;55282:28:0;;;11907:66:1;55257:12:0;;11989::1;;55282:28:0;;;;;;;;;;;;55272:39;;;;;;55257:54;;55344:40;55363:6;55371;;55379:4;55344:18;:40::i;:::-;55322:111;;;;-1:-1:-1;;;55322:111:0;;12214:2:1;55322:111:0;;;12196:21:1;12253:2;12233:18;;;12226:30;-1:-1:-1;;;12272:18:1;;;12265:51;12333:18;;55322:111:0;12012:345:1;55322:111:0;55485:10;;55470:11;55454:13;36257:12;;;36181:94;55454:13;:27;;;;:::i;:::-;:41;;55446:87;;;;-1:-1:-1;;;55446:87:0;;12564:2:1;55446:87:0;;;12546:21:1;;;12583:18;;;12576:30;12642:34;12622:18;;;12615:62;12694:18;;55446:87:0;12362:356:1;55446:87:0;55616:15;;55577:10;55562:26;;;;:14;:26;;;;;:36;:50;;55601:11;;55562:50;:::i;:::-;:69;;55554:130;;;;-1:-1:-1;;;55554:130:0;;12925:2:1;55554:130:0;;;12907:21:1;12964:2;12944:18;;;12937:30;13003:34;12983:18;;;12976:62;-1:-1:-1;;;13054:18:1;;;13047:46;13110:19;;55554:130:0;12723:412:1;55554:130:0;55732:9;55717:11;55705:9;;:23;;;;:::i;:::-;:36;;55697:80;;;;-1:-1:-1;;;55697:80:0;;13515:2:1;55697:80:0;;;13497:21:1;13554:2;13534:18;;;13527:30;13593:33;13573:18;;;13566:61;13644:18;;55697:80:0;13313:355:1;55697:80:0;55790:34;55800:10;55812:11;55790:9;:34::i;:::-;55850:10;55835:26;;;;:14;:26;;;;;:51;;55875:11;;55835:26;:51;;55875:11;;55835:51;:::i;:::-;;;;-1:-1:-1;;;;;55088:809:0:o;36344:177::-;36411:7;36443:13;36257:12;;;36181:94;36443:13;36435:5;:21;36427:69;;;;-1:-1:-1;;;36427:69:0;;13875:2:1;36427:69:0;;;13857:21:1;13914:2;13894:18;;;13887:30;13953:34;13933:18;;;13926:62;-1:-1:-1;;;14004:18:1;;;13997:33;14047:19;;36427:69:0;13673:399:1;36427:69:0;-1:-1:-1;36510:5:0;36344:177::o;53412:105::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;53488:7:::1;:21;53498:11:::0;53488:7;:21:::1;:::i;39169:118::-:0;39233:7;39256:20;39268:7;39256:11;:20::i;:::-;:25;;39169:118;-1:-1:-1;;39169:118:0:o;38046:211::-;38110:7;-1:-1:-1;;;;;38134:19:0;;38126:75;;;;-1:-1:-1;;;38126:75:0;;16483:2:1;38126:75:0;;;16465:21:1;16522:2;16502:18;;;16495:30;16561:34;16541:18;;;16534:62;-1:-1:-1;;;16612:18:1;;;16605:41;16663:19;;38126:75:0;16281:407:1;38126:75:0;-1:-1:-1;;;;;;38223:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38223:27:0;;38046:211::o;51598:94::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;51663:21:::1;51681:1;51663:9;:21::i;:::-;51598:94::o:0;39501:98::-;39557:13;39586:7;39579:14;;;;;:::i;55982:800::-;53183:9;53196:10;53183:23;53175:66;;;;-1:-1:-1;;;53175:66:0;;16895:2:1;53175:66:0;;;16877:21:1;16934:2;16914:18;;;16907:30;16973:32;16953:18;;;16946:60;17023:18;;53175:66:0;16693:354:1;53175:66:0;56113:9:::1;;56126:1;56113:14;56105:55;;;::::0;-1:-1:-1;;;56105:55:0;;17254:2:1;56105:55:0::1;::::0;::::1;17236:21:1::0;17293:2;17273:18;;;17266:30;17332;17312:18;;;17305:58;17380:18;;56105:55:0::1;17052:352:1::0;56105:55:0::1;56203:41;56222:6;56230;;56238:5;56203:18;:41::i;:::-;56181:125;;;::::0;-1:-1:-1;;;56181:125:0;;17611:2:1;56181:125:0::1;::::0;::::1;17593:21:1::0;17650:2;17630:18;;;17623:30;17689:34;17669:18;;;17662:62;-1:-1:-1;;;17740:18:1;;;17733:32;17782:19;;56181:125:0::1;17409:398:1::0;56181:125:0::1;56360:15;;56345:11;56329:13;36257:12:::0;;;36181:94;56329:13:::1;:27;;;;:::i;:::-;:46;;56321:79;;;::::0;-1:-1:-1;;;56321:79:0;;18014:2:1;56321:79:0::1;::::0;::::1;17996:21:1::0;18053:2;18033:18;;;18026:30;-1:-1:-1;;;18072:18:1;;;18065:48;18130:18;;56321:79:0::1;17812:342:1::0;56321:79:0::1;56506:12;::::0;56467:10:::1;56452:26;::::0;;;:14:::1;:26;::::0;;;;:36:::1;;::::0;:50:::1;::::0;56491:11;;56452:50:::1;:::i;:::-;:66;;56444:101;;;::::0;-1:-1:-1;;;56444:101:0;;18361:2:1;56444:101:0::1;::::0;::::1;18343:21:1::0;18400:2;18380:18;;;18373:30;-1:-1:-1;;;18419:18:1;;;18412:52;18481:18;;56444:101:0::1;18159:346:1::0;56444:101:0::1;56620:11;56608:9;;:23;;;;:::i;:::-;56595:9;:36;;56587:77;;;::::0;-1:-1:-1;;;56587:77:0;;18712:2:1;56587:77:0::1;::::0;::::1;18694:21:1::0;18751:2;18731:18;;;18724:30;18790;18770:18;;;18763:58;18838:18;;56587:77:0::1;18510:352:1::0;56587:77:0::1;56677:34;56687:10;56699:11;56677:9;:34::i;:::-;56737:10;56722:26;::::0;;;:14:::1;:26;::::0;;;;:36:::1;;:51:::0;;56762:11;;56722:26;:51:::1;::::0;56762:11;;56722:51:::1;:::i;54084:118::-:0;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54163:12:::1;:30:::0;54084:118::o;54450:85::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54511:6:::1;:15:::0;54450:85::o;58676:176::-;58780:8;2679:42;4573:45;:49;4569:225;;4644:67;;-1:-1:-1;;;4644:67:0;;4695:4;4644:67;;;9081:34:1;-1:-1:-1;;;;;9151:15:1;;9131:18;;;9124:43;2679:42:0;;4644;;9016:18:1;;4644:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4639:144;;4739:28;;-1:-1:-1;;;4739:28:0;;-1:-1:-1;;;;;1976:32:1;;4739:28:0;;;1958:51:1;1931:18;;4739:28:0;1812:203:1;4639:144:0;58801:43:::1;58825:8;58835;58801:23;:43::i;57620:730::-:0;32106:1;32702:7;;:19;32694:63;;;;-1:-1:-1;;;32694:63:0;;19069:2:1;32694:63:0;;;19051:21:1;19108:2;19088:18;;;19081:30;19147:33;19127:18;;;19120:61;19198:18;;32694:63:0;18867:355:1;32694:63:0;32106:1;32835:7;:18;57689:16:::1;57733:3;57708:24;:21;57730:2;57708:24;:::i;:::-;:28;;;;:::i;:::-;57689:47:::0;-1:-1:-1;57758:16:0::1;57802:3;57777:24;:21;57799:2;57777:24;:::i;:::-;:28;;;;:::i;:::-;57758:47:::0;-1:-1:-1;57827:16:0::1;57871:3;57846:24;:21;57868:2;57846:24;:::i;:::-;:28;;;;:::i;:::-;57827:47:::0;-1:-1:-1;57897:16:0::1;57941:3;57916:24;:21;57938:2;57916:24;:::i;:::-;:28;;;;:::i;:::-;57897:47:::0;-1:-1:-1;57965:16:0::1;58008:3;57984:23;:21;58006:1;57984:23;:::i;:::-;:27;;;;:::i;:::-;57965:46;;58066:1;58042:21;:25;58034:49;;;::::0;-1:-1:-1;;;58034:49:0;;19686:2:1;58034:49:0::1;::::0;::::1;19668:21:1::0;19725:2;19705:18;;;19698:30;-1:-1:-1;;;19744:18:1;;;19737:41;19795:18;;58034:49:0::1;19484:335:1::0;58034:49:0::1;58112:7;::::0;58104:31:::1;::::0;-1:-1:-1;;;;;58112:7:0;;::::1;::::0;58104:31;::::1;;;::::0;58126:8;;58112:7:::1;58104:31:::0;58112:7;58104:31;58126:8;58112:7;58104:31;::::1;;;;;;58096:40;;;::::0;::::1;;58163:7;::::0;58155:31:::1;::::0;-1:-1:-1;;;;;58163:7:0;;::::1;::::0;58155:31;::::1;;;::::0;58177:8;;58163:7:::1;58155:31:::0;58163:7;58155:31;58177:8;58163:7;58155:31;::::1;;;;;;58147:40;;;::::0;::::1;;58214:7;::::0;58206:31:::1;::::0;-1:-1:-1;;;;;58214:7:0;;::::1;::::0;58206:31;::::1;;;::::0;58228:8;;58214:7:::1;58206:31:::0;58214:7;58206:31;58228:8;58214:7;58206:31;::::1;;;;;;58198:40;;;::::0;::::1;;58265:7;::::0;58257:31:::1;::::0;-1:-1:-1;;;;;58265:7:0;;::::1;::::0;58257:31;::::1;;;::::0;58279:8;;58265:7:::1;58257:31:::0;58265:7;58257:31;58279:8;58265:7;58257:31;::::1;;;;;;58249:40;;;::::0;::::1;;58316:7;::::0;58308:31:::1;::::0;-1:-1:-1;;;;;58316:7:0;;::::1;::::0;58308:31;::::1;;;::::0;58330:8;;58316:7:::1;58308:31:::0;58316:7;58308:31;58330:8;58316:7;58308:31;::::1;;;;;;58300:40;;;::::0;::::1;;-1:-1:-1::0;;32062:1:0;33014:7;:22;-1:-1:-1;;;57620:730:0:o;53831:127::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;53914:15:::1;:35:::0;53831:127::o;54210:130::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54296:15:::1;:36:::0;54210:130::o;54348:94::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;54415:6:::1;:18:::0;54348:94::o;59375:228::-;59526:4;2679:42;3827:45;:49;3823:539;;4116:10;-1:-1:-1;;;;;4108:18:0;;;4104:85;;59548:47:::1;59571:4;59577:2;59581:7;59590:4;59548:22;:47::i;:::-;4167:7:::0;;4104:85;4208:69;;-1:-1:-1;;;4208:69:0;;4259:4;4208:69;;;9081:34:1;4266:10:0;9131:18:1;;;9124:43;2679:42:0;;4208;;9016:18:1;;4208:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4203:148;;4305:30;;-1:-1:-1;;;4305:30:0;;4324:10;4305:30;;;1958:51:1;1931:18;;4305:30:0;1812:203:1;4203:148:0;59548:47:::1;59571:4;59577:2;59581:7;59590:4;59548:22;:47::i;:::-;59375:228:::0;;;;;:::o;39662:394::-;39760:13;39801:16;39809:7;42831:12;;-1:-1:-1;42821:22:0;42744:105;39801:16;39785:97;;;;-1:-1:-1;;;39785:97:0;;20026:2:1;39785:97:0;;;20008:21:1;20065:2;20045:18;;;20038:30;20104:34;20084:18;;;20077:62;-1:-1:-1;;;20155:18:1;;;20148:45;20210:19;;39785:97:0;19824:411:1;39785:97:0;39891:21;39915:10;:8;:10::i;:::-;39891:34;;39970:1;39952:7;39946:21;:25;:104;;;;;;;;;;;;;;;;;40007:7;40016:18;:7;:16;:18::i;:::-;39990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39946:104;39932:118;39662:394;-1:-1:-1;;;39662:394:0:o;56790:235::-;56848:7;56997:20;57011:5;56997:13;:20::i;51847:192::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51936:22:0;::::1;51928:73;;;::::0;-1:-1:-1;;;51928:73:0;;20943:2:1;51928:73:0::1;::::0;::::1;20925:21:1::0;20982:2;20962:18;;;20955:30;21021:34;21001:18;;;20994:62;-1:-1:-1;;;21072:18:1;;;21065:36;21118:19;;51928:73:0::1;20741:402:1::0;51928:73:0::1;52012:19;52022:8;52012:9;:19::i;:::-;51847:192:::0;:::o;53721:98::-;50993:7;51020:6;-1:-1:-1;;;;;51020:6:0;33733:10;51167:23;51159:68;;;;-1:-1:-1;;;51159:68:0;;;;;;;:::i;:::-;53790:9:::1;:20:::0;53721:98::o;40434:387::-;40511:13;40527:24;40543:7;40527:15;:24::i;:::-;40511:40;;40572:5;-1:-1:-1;;;;;40566:11:0;:2;-1:-1:-1;;;;;40566:11:0;;40558:58;;;;-1:-1:-1;;;40558:58:0;;21350:2:1;40558:58:0;;;21332:21:1;21389:2;21369:18;;;21362:30;21428:34;21408:18;;;21401:62;-1:-1:-1;;;21479:18:1;;;21472:32;21521:19;;40558:58:0;21148:398:1;40558:58:0;33733:10;-1:-1:-1;;;;;40641:21:0;;;;:62;;-1:-1:-1;40666:37:0;40683:5;33733:10;41500:186;:::i;40666:37::-;40625:153;;;;-1:-1:-1;;;40625:153:0;;21753:2:1;40625:153:0;;;21735:21:1;21792:2;21772:18;;;21765:30;21831:34;21811:18;;;21804:62;21902:27;21882:18;;;21875:55;21947:19;;40625:153:0;21551:421:1;40625:153:0;40787:28;40796:2;40800:7;40809:5;40787:8;:28::i;41745:150::-;41861:28;41871:4;41877:2;41881:7;41861:9;:28::i;42855:98::-;42920:27;42930:2;42934:8;42920:27;;;;;;;;;;;;:9;:27::i;41958:165::-;42078:39;42095:4;42101:2;42105:7;42078:39;;;;;;;;;;;;:16;:39::i;6480:190::-;6605:4;6658;6629:25;6642:5;6649:4;6629:12;:25::i;:::-;:33;;6480:190;-1:-1:-1;;;;6480:190:0:o;38509:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;38626:16:0;38634:7;42831:12;;-1:-1:-1;42821:22:0;42744:105;38626:16;38618:71;;;;-1:-1:-1;;;38618:71:0;;22179:2:1;38618:71:0;;;22161:21:1;22218:2;22198:18;;;22191:30;22257:34;22237:18;;;22230:62;-1:-1:-1;;;22308:18:1;;;22301:40;22358:19;;38618:71:0;21977:406:1;38618:71:0;38698:26;38746:12;38735:7;:23;38731:93;;38790:22;38800:12;38790:7;:22;:::i;:::-;:26;;38815:1;38790:26;:::i;:::-;38769:47;;38731:93;38852:7;38832:212;38869:18;38861:4;:26;38832:212;;38906:31;38940:17;;;:11;:17;;;;;;;;;38906:51;;;;;;;;;-1:-1:-1;;;;;38906:51:0;;;;;-1:-1:-1;;;38906:51:0;;;-1:-1:-1;;;;;38906:51:0;;;;;;;;38970:28;38966:71;;39018:9;38509:606;-1:-1:-1;;;;38509:606:0:o;38966:71::-;-1:-1:-1;38889:6:0;;;;:::i;:::-;;;;38832:212;;;-1:-1:-1;39052:57:0;;-1:-1:-1;;;39052:57:0;;22864:2:1;39052:57:0;;;22846:21:1;22903:2;22883:18;;;22876:30;22942:34;22922:18;;;22915:62;-1:-1:-1;;;22993:18:1;;;22986:45;23048:19;;39052:57:0;22662:411:1;52047:173:0;52103:16;52122:6;;-1:-1:-1;;;;;52139:17:0;;;-1:-1:-1;;;;;;52139:17:0;;;;;;52172:40;;52122:6;;;;;;;52172:40;;52103:16;52172:40;52092:128;52047:173;:::o;41155:282::-;33733:10;-1:-1:-1;;;;;41254:24:0;;;41246:63;;;;-1:-1:-1;;;41246:63:0;;23280:2:1;41246:63:0;;;23262:21:1;23319:2;23299:18;;;23292:30;23358:28;23338:18;;;23331:56;23404:18;;41246:63:0;23078:350:1;41246:63:0;33733:10;41318:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;41318:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;41318:53:0;;;;;;;;;;41383:48;;819:41:1;;;41318:42:0;;33733:10;41383:48;;792:18:1;41383:48:0;;;;;;;41155:282;;:::o;42186:319::-;42331:28;42341:4;42347:2;42351:7;42331:9;:28::i;:::-;42382:48;42405:4;42411:2;42415:7;42424:5;42382:22;:48::i;:::-;42366:133;;;;-1:-1:-1;;;42366:133:0;;;;;;;:::i;53296:108::-;53356:13;53389:7;53382:14;;;;;:::i;11679:723::-;11735:13;11956:5;11965:1;11956:10;11952:53;;-1:-1:-1;;11983:10:0;;;;;;;;;;;;-1:-1:-1;;;11983:10:0;;;;;11679:723::o;11952:53::-;12030:5;12015:12;12071:78;12078:9;;12071:78;;12104:8;;;;:::i;:::-;;-1:-1:-1;12127:10:0;;-1:-1:-1;12135:2:0;12127:10;;:::i;:::-;;;12071:78;;;12159:19;12191:6;-1:-1:-1;;;;;12181:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12181:17:0;;12159:39;;12209:154;12216:10;;12209:154;;12243:11;12253:1;12243:11;;:::i;:::-;;-1:-1:-1;12312:10:0;12320:2;12312:5;:10;:::i;:::-;12299:24;;:2;:24;:::i;:::-;12286:39;;12269:6;12276;12269:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;12269:56:0;;;;;;;;-1:-1:-1;12340:11:0;12349:2;12340:11;;:::i;:::-;;;12209:154;;;12387:6;11679:723;-1:-1:-1;;;;11679:723:0:o;38263:240::-;38324:7;-1:-1:-1;;;;;38356:19:0;;38340:102;;;;-1:-1:-1;;;38340:102:0;;24304:2:1;38340:102:0;;;24286:21:1;24343:2;24323:18;;;24316:30;24382:34;24362:18;;;24355:62;-1:-1:-1;;;24433:18:1;;;24426:47;24490:19;;38340:102:0;24102:413:1;38340:102:0;-1:-1:-1;;;;;;38464:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;38464:32:0;;-1:-1:-1;;;;;38464:32:0;;38263:240::o;46431:172::-;46528:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46528:29:0;-1:-1:-1;;;;;46528:29:0;;;;;;;;;46569:28;;46528:24;;46569:28;;;;;;;46431:172;;;:::o;44796:1529::-;44893:35;44931:20;44943:7;44931:11;:20::i;:::-;45002:18;;44893:58;;-1:-1:-1;44960:22:0;;-1:-1:-1;;;;;44986:34:0;33733:10;-1:-1:-1;;;;;44986:34:0;;:81;;;-1:-1:-1;33733:10:0;45031:20;45043:7;45031:11;:20::i;:::-;-1:-1:-1;;;;;45031:36:0;;44986:81;:142;;;-1:-1:-1;45095:18:0;;45078:50;;33733:10;41500:186;:::i;45078:50::-;44960:169;;45154:17;45138:101;;;;-1:-1:-1;;;45138:101:0;;24722:2:1;45138:101:0;;;24704:21:1;24761:2;24741:18;;;24734:30;24800:34;24780:18;;;24773:62;-1:-1:-1;;;24851:18:1;;;24844:48;24909:19;;45138:101:0;24520:414:1;45138:101:0;45286:4;-1:-1:-1;;;;;45264:26:0;:13;:18;;;-1:-1:-1;;;;;45264:26:0;;45248:98;;;;-1:-1:-1;;;45248:98:0;;25141:2:1;45248:98:0;;;25123:21:1;25180:2;25160:18;;;25153:30;25219:34;25199:18;;;25192:62;-1:-1:-1;;;25270:18:1;;;25263:36;25316:19;;45248:98:0;24939:402:1;45248:98:0;-1:-1:-1;;;;;45361:16:0;;45353:66;;;;-1:-1:-1;;;45353:66:0;;25548:2:1;45353:66:0;;;25530:21:1;25587:2;25567:18;;;25560:30;25626:34;25606:18;;;25599:62;-1:-1:-1;;;25677:18:1;;;25670:35;25722:19;;45353:66:0;25346:401:1;45353:66:0;45528:49;45545:1;45549:7;45558:13;:18;;;45528:8;:49::i;:::-;-1:-1:-1;;;;;45586:18:0;;;;;;:12;:18;;;;;:31;;45616:1;;45586:18;:31;;45616:1;;-1:-1:-1;;;;;45586:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;45586:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45624:16:0;;-1:-1:-1;45624:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;45624:16:0;;:29;;-1:-1:-1;;45624:29:0;;:::i;:::-;;;-1:-1:-1;;;;;45624:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45683:43:0;;;;;;;;-1:-1:-1;;;;;45683:43:0;;;;;-1:-1:-1;;;;;45709:15:0;45683:43;;;;;;;;;-1:-1:-1;45660:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;45660:66:0;-1:-1:-1;;;;;;45660:66:0;;;;;;;;;;;45976:11;45672:7;-1:-1:-1;45976:11:0;:::i;:::-;46039:1;45998:24;;;:11;:24;;;;;:29;45954:33;;-1:-1:-1;;;;;;45998:29:0;45994:236;;46056:20;46064:11;42831:12;;-1:-1:-1;42821:22:0;42744:105;46056:20;46052:171;;;46116:97;;;;;;;;46143:18;;-1:-1:-1;;;;;46116:97:0;;;;;;46174:28;;;;-1:-1:-1;;;;;46116:97:0;;;;;;;;;-1:-1:-1;46089:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;46089:124:0;-1:-1:-1;;;;;;46089:124:0;;;;;;;;;;;;46052:171;46262:7;46258:2;-1:-1:-1;;;;;46243:27:0;46252:4;-1:-1:-1;;;;;46243:27:0;;;;;;;;;;;46277:42;44886:1439;;;44796:1529;;;:::o;43292:1272::-;43420:12;;-1:-1:-1;;;;;43447:16:0;;43439:62;;;;-1:-1:-1;;;43439:62:0;;26361:2:1;43439:62:0;;;26343:21:1;26400:2;26380:18;;;26373:30;26439:34;26419:18;;;26412:62;-1:-1:-1;;;26490:18:1;;;26483:31;26531:19;;43439:62:0;26159:397:1;43439:62:0;43638:21;43646:12;42831;;-1:-1:-1;42821:22:0;42744:105;43638:21;43637:22;43629:64;;;;-1:-1:-1;;;43629:64:0;;26763:2:1;43629:64:0;;;26745:21:1;26802:2;26782:18;;;26775:30;26841:31;26821:18;;;26814:59;26890:18;;43629:64:0;26561:353:1;43629:64:0;43720:12;43708:8;:24;;43700:71;;;;-1:-1:-1;;;43700:71:0;;27121:2:1;43700:71:0;;;27103:21:1;27160:2;27140:18;;;27133:30;27199:34;27179:18;;;27172:62;-1:-1:-1;;;27250:18:1;;;27243:32;27292:19;;43700:71:0;26919:398:1;43700:71:0;-1:-1:-1;;;;;43883:16:0;;43850:30;43883:16;;;:12;:16;;;;;;;;;43850:49;;;;;;;;;-1:-1:-1;;;;;43850:49:0;;;;;-1:-1:-1;;;43850:49:0;;;;;;;;;;;43925:119;;;;;;;;43945:19;;43850:49;;43925:119;;;43945:39;;43975:8;;43945:39;:::i;:::-;-1:-1:-1;;;;;43925:119:0;;;;;44028:8;43993:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;43925:119:0;;;;;;-1:-1:-1;;;;;43906:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;43906:138:0;;;;;;;;;;;;44079:43;;;;;;;;;;-1:-1:-1;;;;;44105:15:0;44079:43;;;;;;;;44051:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;44051:71:0;-1:-1:-1;;;;;;44051:71:0;;;;;;;;;;;;;;;;;;44063:12;;44175:281;44199:8;44195:1;:12;44175:281;;;44228:38;;44253:12;;-1:-1:-1;;;;;44228:38:0;;;44245:1;;44228:38;;44245:1;;44228:38;44293:59;44324:1;44328:2;44332:12;44346:5;44293:22;:59::i;:::-;44275:150;;;;-1:-1:-1;;;44275:150:0;;;;;;;:::i;:::-;44434:14;;;;:::i;:::-;;;;44209:3;;;;;:::i;:::-;;;;44175:281;;;-1:-1:-1;44464:12:0;:27;;;44498:60;59025:163;7347:296;7430:7;7473:4;7430:7;7488:118;7512:5;:12;7508:1;:16;7488:118;;;7561:33;7571:12;7585:5;7591:1;7585:8;;;;;;;;:::i;:::-;;;;;;;7561:9;:33::i;:::-;7546:48;-1:-1:-1;7526:3:0;;;;:::i;:::-;;;;7488:118;;;-1:-1:-1;7623:12:0;7347:296;-1:-1:-1;;;7347:296:0:o;48146:690::-;48283:4;-1:-1:-1;;;;;48300:13:0;;14505:20;14553:8;48296:535;;48339:72;;-1:-1:-1;;;48339:72:0;;-1:-1:-1;;;;;48339:36:0;;;;;:72;;33733:10;;48390:4;;48396:7;;48405:5;;48339:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48339:72:0;;;;;;;;-1:-1:-1;;48339:72:0;;;;;;;;;;;;:::i;:::-;;;48326:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48570:6;:13;48587:1;48570:18;48566:215;;48603:61;;-1:-1:-1;;;48603:61:0;;;;;;;:::i;48566:215::-;48749:6;48743:13;48734:6;48730:2;48726:15;48719:38;48326:464;-1:-1:-1;;;;;;48461:55:0;-1:-1:-1;;;48461:55:0;;-1:-1:-1;48454:62:0;;48296:535;-1:-1:-1;48819:4:0;48146:690;;;;;;:::o;10958:149::-;11021:7;11052:1;11048;:5;:51;;11183:13;11277:15;;;11313:4;11306:15;;;11360:4;11344:21;;11048:51;;;-1:-1:-1;11183:13:0;11277:15;;;11313:4;11306:15;11360:4;11344:21;;;10958:149::o;293:131:1:-;-1:-1:-1;;;;;;367:32:1;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:250::-;956:1;966:113;980:6;977:1;974:13;966:113;;;1056:11;;;1050:18;1037:11;;;1030:39;1002:2;995:10;966:113;;;-1:-1:-1;;1113:1:1;1095:16;;1088:27;871:250::o;1126:271::-;1168:3;1206:5;1200:12;1233:6;1228:3;1221:19;1249:76;1318:6;1311:4;1306:3;1302:14;1295:4;1288:5;1284:16;1249:76;:::i;:::-;1379:2;1358:15;-1:-1:-1;;1354:29:1;1345:39;;;;1386:4;1341:50;;1126:271;-1:-1:-1;;1126:271:1:o;1402:220::-;1551:2;1540:9;1533:21;1514:4;1571:45;1612:2;1601:9;1597:18;1589:6;1571:45;:::i;1627:180::-;1686:6;1739:2;1727:9;1718:7;1714:23;1710:32;1707:52;;;1755:1;1752;1745:12;1707:52;-1:-1:-1;1778:23:1;;1627:180;-1:-1:-1;1627:180:1:o;2020:173::-;2088:20;;-1:-1:-1;;;;;2137:31:1;;2127:42;;2117:70;;2183:1;2180;2173:12;2117:70;2020:173;;;:::o;2198:254::-;2266:6;2274;2327:2;2315:9;2306:7;2302:23;2298:32;2295:52;;;2343:1;2340;2333:12;2295:52;2366:29;2385:9;2366:29;:::i;:::-;2356:39;2442:2;2427:18;;;;2414:32;;-1:-1:-1;;;2198:254:1:o;2639:328::-;2716:6;2724;2732;2785:2;2773:9;2764:7;2760:23;2756:32;2753:52;;;2801:1;2798;2791:12;2753:52;2824:29;2843:9;2824:29;:::i;:::-;2814:39;;2872:38;2906:2;2895:9;2891:18;2872:38;:::i;:::-;2862:48;;2957:2;2946:9;2942:18;2929:32;2919:42;;2639:328;;;;;:::o;3154:127::-;3215:10;3210:3;3206:20;3203:1;3196:31;3246:4;3243:1;3236:15;3270:4;3267:1;3260:15;3286:275;3357:2;3351:9;3422:2;3403:13;;-1:-1:-1;;3399:27:1;3387:40;;-1:-1:-1;;;;;3442:34:1;;3478:22;;;3439:62;3436:88;;;3504:18;;:::i;:::-;3540:2;3533:22;3286:275;;-1:-1:-1;3286:275:1:o;3566:712::-;3620:5;3673:3;3666:4;3658:6;3654:17;3650:27;3640:55;;3691:1;3688;3681:12;3640:55;3727:6;3714:20;3753:4;-1:-1:-1;;;;;3772:2:1;3769:26;3766:52;;;3798:18;;:::i;:::-;3844:2;3841:1;3837:10;3867:28;3891:2;3887;3883:11;3867:28;:::i;:::-;3929:15;;;3999;;;3995:24;;;3960:12;;;;4031:15;;;4028:35;;;4059:1;4056;4049:12;4028:35;4095:2;4087:6;4083:15;4072:26;;4107:142;4123:6;4118:3;4115:15;4107:142;;;4189:17;;4177:30;;4140:12;;;;4227;;;;4107:142;;;4267:5;3566:712;-1:-1:-1;;;;;;;3566:712:1:o;4283:416::-;4376:6;4384;4437:2;4425:9;4416:7;4412:23;4408:32;4405:52;;;4453:1;4450;4443:12;4405:52;4489:9;4476:23;4466:33;;4550:2;4539:9;4535:18;4522:32;-1:-1:-1;;;;;4569:6:1;4566:30;4563:50;;;4609:1;4606;4599:12;4563:50;4632:61;4685:7;4676:6;4665:9;4661:22;4632:61;:::i;:::-;4622:71;;;4283:416;;;;;:::o;4704:407::-;4769:5;-1:-1:-1;;;;;4795:6:1;4792:30;4789:56;;;4825:18;;:::i;:::-;4863:57;4908:2;4887:15;;-1:-1:-1;;4883:29:1;4914:4;4879:40;4863:57;:::i;:::-;4854:66;;4943:6;4936:5;4929:21;4983:3;4974:6;4969:3;4965:16;4962:25;4959:45;;;5000:1;4997;4990:12;4959:45;5049:6;5044:3;5037:4;5030:5;5026:16;5013:43;5103:1;5096:4;5087:6;5080:5;5076:18;5072:29;5065:40;4704:407;;;;;:::o;5116:451::-;5185:6;5238:2;5226:9;5217:7;5213:23;5209:32;5206:52;;;5254:1;5251;5244:12;5206:52;5294:9;5281:23;-1:-1:-1;;;;;5319:6:1;5316:30;5313:50;;;5359:1;5356;5349:12;5313:50;5382:22;;5435:4;5427:13;;5423:27;-1:-1:-1;5413:55:1;;5464:1;5461;5454:12;5413:55;5487:74;5553:7;5548:2;5535:16;5530:2;5526;5522:11;5487:74;:::i;5572:186::-;5631:6;5684:2;5672:9;5663:7;5659:23;5655:32;5652:52;;;5700:1;5697;5690:12;5652:52;5723:29;5742:9;5723:29;:::i;5763:484::-;5865:6;5873;5881;5934:2;5922:9;5913:7;5909:23;5905:32;5902:52;;;5950:1;5947;5940:12;5902:52;5986:9;5973:23;5963:33;;6047:2;6036:9;6032:18;6019:32;-1:-1:-1;;;;;6066:6:1;6063:30;6060:50;;;6106:1;6103;6096:12;6060:50;6129:61;6182:7;6173:6;6162:9;6158:22;6129:61;:::i;:::-;6119:71;;;6237:2;6226:9;6222:18;6209:32;6199:42;;5763:484;;;;;:::o;6690:118::-;6776:5;6769:13;6762:21;6755:5;6752:32;6742:60;;6798:1;6795;6788:12;6813:315;6878:6;6886;6939:2;6927:9;6918:7;6914:23;6910:32;6907:52;;;6955:1;6952;6945:12;6907:52;6978:29;6997:9;6978:29;:::i;:::-;6968:39;;7057:2;7046:9;7042:18;7029:32;7070:28;7092:5;7070:28;:::i;:::-;7117:5;7107:15;;;6813:315;;;;;:::o;7133:667::-;7228:6;7236;7244;7252;7305:3;7293:9;7284:7;7280:23;7276:33;7273:53;;;7322:1;7319;7312:12;7273:53;7345:29;7364:9;7345:29;:::i;:::-;7335:39;;7393:38;7427:2;7416:9;7412:18;7393:38;:::i;:::-;7383:48;;7478:2;7467:9;7463:18;7450:32;7440:42;;7533:2;7522:9;7518:18;7505:32;-1:-1:-1;;;;;7552:6:1;7549:30;7546:50;;;7592:1;7589;7582:12;7546:50;7615:22;;7668:4;7660:13;;7656:27;-1:-1:-1;7646:55:1;;7697:1;7694;7687:12;7646:55;7720:74;7786:7;7781:2;7768:16;7763:2;7759;7755:11;7720:74;:::i;:::-;7710:84;;;7133:667;;;;;;;:::o;7805:260::-;7873:6;7881;7934:2;7922:9;7913:7;7909:23;7905:32;7902:52;;;7950:1;7947;7940:12;7902:52;7973:29;7992:9;7973:29;:::i;:::-;7963:39;;8021:38;8055:2;8044:9;8040:18;8021:38;:::i;:::-;8011:48;;7805:260;;;;;:::o;8070:380::-;8149:1;8145:12;;;;8192;;;8213:61;;8267:4;8259:6;8255:17;8245:27;;8213:61;8320:2;8312:6;8309:14;8289:18;8286:38;8283:161;;8366:10;8361:3;8357:20;8354:1;8347:31;8401:4;8398:1;8391:15;8429:4;8426:1;8419:15;8283:161;;8070:380;;;:::o;9178:245::-;9245:6;9298:2;9286:9;9277:7;9273:23;9269:32;9266:52;;;9314:1;9311;9304:12;9266:52;9346:9;9340:16;9365:28;9387:5;9365:28;:::i;9428:356::-;9630:2;9612:21;;;9649:18;;;9642:30;9708:34;9703:2;9688:18;;9681:62;9775:2;9760:18;;9428:356::o;10192:127::-;10253:10;10248:3;10244:20;10241:1;10234:31;10284:4;10281:1;10274:15;10308:4;10305:1;10298:15;10324:135;10363:3;10384:17;;;10381:43;;10404:18;;:::i;:::-;-1:-1:-1;10451:1:1;10440:13;;10324:135::o;10879:125::-;10944:9;;;10965:10;;;10962:36;;;10978:18;;:::i;13140:168::-;13213:9;;;13244;;13261:15;;;13255:22;;13241:37;13231:71;;13282:18;;:::i;14203:545::-;14305:2;14300:3;14297:11;14294:448;;;14341:1;14366:5;14362:2;14355:17;14411:4;14407:2;14397:19;14481:2;14469:10;14465:19;14462:1;14458:27;14452:4;14448:38;14517:4;14505:10;14502:20;14499:47;;;-1:-1:-1;14540:4:1;14499:47;14595:2;14590:3;14586:12;14583:1;14579:20;14573:4;14569:31;14559:41;;14650:82;14668:2;14661:5;14658:13;14650:82;;;14713:17;;;14694:1;14683:13;14650:82;;14924:1352;15050:3;15044:10;-1:-1:-1;;;;;15069:6:1;15066:30;15063:56;;;15099:18;;:::i;:::-;15128:97;15218:6;15178:38;15210:4;15204:11;15178:38;:::i;:::-;15172:4;15128:97;:::i;:::-;15280:4;;15344:2;15333:14;;15361:1;15356:663;;;;16063:1;16080:6;16077:89;;;-1:-1:-1;16132:19:1;;;16126:26;16077:89;-1:-1:-1;;14881:1:1;14877:11;;;14873:24;14869:29;14859:40;14905:1;14901:11;;;14856:57;16179:81;;15326:944;;15356:663;14150:1;14143:14;;;14187:4;14174:18;;-1:-1:-1;;15392:20:1;;;15510:236;15524:7;15521:1;15518:14;15510:236;;;15613:19;;;15607:26;15592:42;;15705:27;;;;15673:1;15661:14;;;;15540:19;;15510:236;;;15514:3;15774:6;15765:7;15762:19;15759:201;;;15835:19;;;15829:26;-1:-1:-1;;15918:1:1;15914:14;;;15930:3;15910:24;15906:37;15902:42;15887:58;15872:74;;15759:201;-1:-1:-1;;;;;16006:1:1;15990:14;;;15986:22;15973:36;;-1:-1:-1;14924:1352:1:o;19227:127::-;19288:10;19283:3;19279:20;19276:1;19269:31;19319:4;19316:1;19309:15;19343:4;19340:1;19333:15;19359:120;19399:1;19425;19415:35;;19430:18;;:::i;:::-;-1:-1:-1;19464:9:1;;19359:120::o;20240:496::-;20419:3;20457:6;20451:13;20473:66;20532:6;20527:3;20520:4;20512:6;20508:17;20473:66;:::i;:::-;20602:13;;20561:16;;;;20624:70;20602:13;20561:16;20671:4;20659:17;;20624:70;:::i;:::-;20710:20;;20240:496;-1:-1:-1;;;;20240:496:1:o;22388:128::-;22455:9;;;22476:11;;;22473:37;;;22490:18;;:::i;22521:136::-;22560:3;22588:5;22578:39;;22597:18;;:::i;:::-;-1:-1:-1;;;22633:18:1;;22521:136::o;23433:415::-;23635:2;23617:21;;;23674:2;23654:18;;;23647:30;23713:34;23708:2;23693:18;;23686:62;-1:-1:-1;;;23779:2:1;23764:18;;23757:49;23838:3;23823:19;;23433:415::o;23853:112::-;23885:1;23911;23901:35;;23916:18;;:::i;:::-;-1:-1:-1;23950:9:1;;23853:112::o;23970:127::-;24031:10;24026:3;24022:20;24019:1;24012:31;24062:4;24059:1;24052:15;24086:4;24083:1;24076:15;25752:200;-1:-1:-1;;;;;25888:10:1;;;25876;;;25872:27;;25911:12;;;25908:38;;;25926:18;;:::i;:::-;25908:38;25752:200;;;;:::o;25957:197::-;-1:-1:-1;;;;;26079:10:1;;;26091;;;26075:27;;26114:11;;;26111:37;;;26128:18;;:::i;27322:489::-;-1:-1:-1;;;;;27591:15:1;;;27573:34;;27643:15;;27638:2;27623:18;;27616:43;27690:2;27675:18;;27668:34;;;27738:3;27733:2;27718:18;;27711:31;;;27516:4;;27759:46;;27785:19;;27777:6;27759:46;:::i;:::-;27751:54;27322:489;-1:-1:-1;;;;;;27322:489:1:o;27816:249::-;27885:6;27938:2;27926:9;27917:7;27913:23;27909:32;27906:52;;;27954:1;27951;27944:12;27906:52;27986:9;27980:16;28005:30;28029:5;28005:30;:::i
Swarm Source
ipfs://9a7420052a0a4924090552eff1423dce95c58253deb854fd1794ee88878f6b4d
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.