ERC-1155
Overview
Max Total Supply
100 NSS
Holders
99
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NSS_NFT
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-10 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/access/Ownable.sol // // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Strings.sol // // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: contracts/NSS_NFT.sol // pragma solidity ^0.8.4; contract NSS_NFT is ERC1155, Ownable { uint256[] supplies = [ 1,1,1,1,1,1,1,1,1,1, //starting with 48 static nfts 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1, // 2 animated nfts 10, // 5 collectables 10, 10, 10, 10 ]; uint256[] private _randomNumbers; uint256 private _randomNumbersCount; mapping(address => uint256) public mintedPerAddress; mapping(uint256 => uint256) public minted; mapping(address => bool) private admins; mapping(uint256 => uint256) public costs; uint256 maxMintPerAddress = 1; bool enabled = false; string baseUri = ""; string public name = "NSS"; string public symbol = "NSS"; constructor() ERC1155("") { uint256 supply_; uint256 j; for (uint256 i = 0; i < supplies.length; i += 1) { supply_ = supplies[i]; for (j = 0; j < supply_;j += 1){ _randomNumbers.push(i + 1); } } _randomNumbersCount = 100; admins[0x5211063C82D0CD0aB516a063206D50AA919eac75] = true; } modifier onlyAdmin() { require(admins[msg.sender] || msg.sender == owner(),"Only admins can access this function"); _; } function setMaxMintPerAddress(uint256 maxMintPerAddress_) public onlyAdmin { maxMintPerAddress = maxMintPerAddress_; } function isAdmin(address addr_) public view onlyAdmin returns(bool) { return admins[addr_]; } function addAdmin(address addr_) public onlyAdmin { admins[addr_] = true; } function removeAdmin(address addr_) public onlyAdmin { admins[addr_] = false; } function setBaseUri(string memory _baseUri) public onlyAdmin { baseUri = _baseUri; } function emptyRngPool() public onlyAdmin { delete _randomNumbers; } function refillTokenRngSupply(uint256 tokenId,uint overrideQuantity) public onlyAdmin { uint256 supply_ = overrideQuantity == 0 ? supplies[tokenId - 1] : overrideQuantity; uint256 i; _randomNumbersCount = _randomNumbersCount + supply_; for (i = 0; i < supply_;i += 1){ _randomNumbers.push(tokenId); } } function refillSingleTokenRngSupply(uint256 tokenId) external onlyAdmin { _randomNumbers.push(tokenId); } function getTokenRng() external view onlyAdmin returns(uint256[] memory) { return _randomNumbers; } function setSupply(uint256 tokenId, uint256 supply, bool refill) external onlyAdmin { require(tokenId > 0,"TokenId should be higher than 0"); if (tokenId > supplies.length){ supplies.push(supply); }else{ supplies[tokenId - 1] = supply; } if (refill){ refillTokenRngSupply(tokenId,0); } } function setCost(uint256 tokenId, uint256 cost) external onlyAdmin { require(tokenId > 0,"TokenId should be higher than 0"); costs[tokenId] = cost; } function mint() external payable { uint256 id = rng(); uint256 index = id - 1; bool _hasntMinted = hasntAlreadyMinted(msg.sender); require(enabled, "Minting is not enabled"); require(id > 0, "Token does not exist"); require(id <= supplies.length, "Token does not exists"); require(minted[index] < supplies[index], "Not enough supplies"); require(msg.value >= costs[index], "Not enough ethers"); require(_hasntMinted,"Exceeded mint limit"); if (_hasntMinted){ _mint(msg.sender, id, 1, ""); mintedPerAddress[msg.sender] += 1; minted[index] += 1; } } function hasntAlreadyMinted(address _user) public view returns(bool) { return mintedPerAddress[_user] < maxMintPerAddress; } function totalSupply( uint256 _id ) public view returns(uint256) { return supplies[_id - 1]; } function getSupply() external view returns (uint256) { return _randomNumbersCount; } function getRemainingSupply() public view returns(uint256) { return _randomNumbers.length; } function clone(uint256[] memory _array, uint256 _length) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](_length); for (uint256 i = 0; i < _length; i++) { array[i] = _array[i]; } return array; } function getRandomNum() private view returns (uint256){ uint256 randomHash = uint256( keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp ) ) ); return randomHash; } function rng() public returns(uint256) { /* FIXME FOR TESTING PURPOSES WE LEAVE IT HERE AS PUBLIC */ require(_randomNumbers.length > 0,"Supply depleted"); uint256 randomIndex = getRandomNum() % _randomNumbers.length; // draw the current random number by taking the value at the random index uint256 resultNumber = _randomNumbers[randomIndex]; // write the last number of the array to the current position. // thus we take out the used number from the circulation and store the last number of the array for future use _randomNumbers[randomIndex] = _randomNumbers[_randomNumbers.length - 1]; // reduce the size of the array by 1 (this deletes the last record we’ve copied at the previous step) _randomNumbers.pop(); return resultNumber; } function kill() public payable onlyOwner { if (msg.sender == owner()) selfdestruct(payable(owner())); } function withdraw() public onlyOwner { require(address(this).balance > 0, "Balance should be greater than 0"); payable(owner()).transfer(address(this).balance); } function setEnabled() public onlyAdmin { enabled = true; } function setDisabled() public onlyAdmin { enabled = false; } function uri(uint256 tokenId) public override view returns(string memory){ return ( string( abi.encodePacked( baseUri, Strings.toString(tokenId), ".json" ) ) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"costs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emptyRngPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRemainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenRng","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"hasntAlreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"refillSingleTokenRngSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"overrideQuantity","type":"uint256"}],"name":"refillTokenRngSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rng","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintPerAddress_","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bool","name":"refill","type":"bool"}],"name":"setSupply","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":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6107606040526001608081815260a082905260c082905260e08290526101008290526101208290526101408290526101608290526101808290526101a08290526101c08290526101e08290526102008290526102208290526102408290526102608290526102808290526102a08290526102c08290526102e08290526103008290526103208290526103408290526103608290526103808290526103a08290526103c08290526103e08290526104008290526104208290526104408290526104608290526104808290526104a08290526104c08290526104e08290526105008290526105208290526105408290526105608290526105808290526105a08290526105c08290526105e08290526106008290526106208290526106408290526106608290526106808290526106a091909152600a6106c08190526106e0819052610700819052610720819052610740526200015e9060049060376200036e565b506001600b55600c805460ff191690556040805160208101918290526000908190526200018e91600d91620003c3565b50604080518082019091526003808252624e535360e81b6020909201918252620001bb91600e91620003c3565b50604080518082019091526003808252624e535360e81b6020909201918252620001e891600f91620003c3565b50348015620001f657600080fd5b50604080516020810190915260008152620002118162000303565b506200021d336200031c565b60008060005b600454811015620002ac576004818154811062000244576200024462000457565b90600052602060002001549250600091505b82821015620002975760056200026e8260016200046d565b8154600181810184556000938452602090932001556200028f90836200046d565b915062000256565b620002a46001826200046d565b905062000223565b5050606460065550735211063c82d0cd0ab516a063206d50aa919eac7560005260096020527f49b7e4a218a2475e2ccddcdb1e3e8c11bbf091d955e0b10660cfdfc1e1721553805460ff19166001179055620004d1565b805162000318906002906020840190620003c3565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620003b1579160200282015b82811115620003b1578251829060ff169055916020019190600101906200038f565b50620003bf92915062000440565b5090565b828054620003d19062000494565b90600052602060002090601f016020900481019282620003f55760008555620003b1565b82601f106200041057805160ff1916838001178555620003b1565b82800160010185558215620003b1579182015b82811115620003b157825182559160200191906001019062000423565b5b80821115620003bf576000815560010162000441565b634e487b7160e01b600052603260045260246000fd5b600082198211156200048f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620004a957607f821691505b60208210811415620004cb57634e487b7160e01b600052602260045260246000fd5b50919050565b612b3180620004e16000396000f3fe6080604052600436106102195760003560e01c8063778ef13d11610123578063bd85b039116100ab578063e4b7fb731161006f578063e4b7fb731461060a578063e985e9c51461061f578063f242432a14610668578063f2fde38b14610688578063fbb2e4da146106a857600080fd5b8063bd85b03914610573578063cdb9762e14610593578063d445b978146105b3578063d586b9d1146105e0578063d605787b146105f557600080fd5b806395d89b41116100f257806395d89b41146104cd5780639b6d8323146104e2578063a0bcfc7f146104f7578063a22cb46514610517578063adcb55231461053757600080fd5b8063778ef13d146104435780637dc0bf3f146104635780638da5cb5b146104905780638ec280cf146104b857600080fd5b80632eb2c2d6116101a65780634e1273f4116101755780634e1273f4146103ac5780636c9c2faf146103d957806370480275146103ee578063715018a61461040e5780637696e0881461042357600080fd5b80632eb2c2d6146103425780633ccfd60b1461036257806341c0e1b51461037757806349b3b29f1461037f57600080fd5b80631249c58b116101ed5780631249c58b146102c35780631785f53c146102cd5780631e14d44b146102ed57806324d7806c1461030d57806326e41dd81461032d57600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806306fdde03146102815780630e89341c146102a3575b600080fd5b34801561022a57600080fd5b5061023e6102393660046120b7565b6106c8565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046120f7565b61075f565b6040519015158152602001610248565b34801561028d57600080fd5b506102966107b1565b6040516102489190612173565b3480156102af57600080fd5b506102966102be366004612186565b61083f565b6102cb610873565b005b3480156102d957600080fd5b506102cb6102e836600461219f565b610afb565b3480156102f957600080fd5b506102cb610308366004612186565b610b60565b34801561031957600080fd5b5061027161032836600461219f565b610ba9565b34801561033957600080fd5b506102cb610c10565b34801561034e57600080fd5b506102cb61035d366004612310565b610c63565b34801561036e57600080fd5b506102cb610cfa565b6102cb610db0565b34801561038b57600080fd5b5061023e61039a366004612186565b600a6020526000908152604090205481565b3480156103b857600080fd5b506103cc6103c73660046123ba565b610dfd565b60405161024891906124c0565b3480156103e557600080fd5b5060065461023e565b3480156103fa57600080fd5b506102cb61040936600461219f565b610f27565b34801561041a57600080fd5b506102cb610f8f565b34801561042f57600080fd5b506102cb61043e3660046124d3565b610fc3565b34801561044f57600080fd5b506102cb61045e366004612186565b611069565b34801561046f57600080fd5b5061023e61047e366004612186565b60086020526000908152604090205481565b34801561049c57600080fd5b506003546040516001600160a01b039091168152602001610248565b3480156104c457600080fd5b506102cb6110e2565b3480156104d957600080fd5b50610296611132565b3480156104ee57600080fd5b506103cc61113f565b34801561050357600080fd5b506102cb6105123660046124f5565b6111dd565b34801561052357600080fd5b506102cb61053236600461254e565b611238565b34801561054357600080fd5b5061027161055236600461219f565b600b546001600160a01b039091166000908152600760205260409020541090565b34801561057f57600080fd5b5061023e61058e366004612186565b611243565b34801561059f57600080fd5b506102cb6105ae366004612581565b611274565b3480156105bf57600080fd5b5061023e6105ce36600461219f565b60076020526000908152604090205481565b3480156105ec57600080fd5b506102cb611388565b34801561060157600080fd5b5061023e6113d8565b34801561061657600080fd5b5060055461023e565b34801561062b57600080fd5b5061027161063a3660046125b6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561067457600080fd5b506102cb6106833660046125e0565b61152f565b34801561069457600080fd5b506102cb6106a336600461219f565b6115b6565b3480156106b457600080fd5b506102cb6106c33660046124d3565b61164e565b60006001600160a01b0383166107395760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061079057506001600160e01b031982166303a24d0760e21b145b806107ab57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600e80546107be90612645565b80601f01602080910402602001604051908101604052809291908181526020018280546107ea90612645565b80156108375780601f1061080c57610100808354040283529160200191610837565b820191906000526020600020905b81548152906001019060200180831161081a57829003601f168201915b505050505081565b6060600d61084c83611737565b60405160200161085d92919061269c565b6040516020818303038152906040529050919050565b600061087d6113d8565b9050600061088c60018361276d565b600b5433600090815260076020526040902054600c54929350109060ff166108ef5760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401610730565b600083116109365760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610730565b6004548311156109805760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20646f6573206e6f742065786973747360581b6044820152606401610730565b6004828154811061099357610993612784565b90600052602060002001546008600084815260200190815260200160002054106109f55760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f75676820737570706c69657360681b6044820152606401610730565b6000828152600a6020526040902054341015610a475760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682065746865727360781b6044820152606401610730565b80610a8a5760405162461bcd60e51b8152602060048201526013602482015272115e18d959591959081b5a5b9d081b1a5b5a5d606a1b6044820152606401610730565b8015610af657610aac338460016040518060200160405280600081525061183d565b336000908152600760205260408120805460019290610acc90849061279a565b90915550506000828152600860205260408120805460019290610af090849061279a565b90915550505b505050565b3360009081526009602052604090205460ff1680610b2357506003546001600160a01b031633145b610b3f5760405162461bcd60e51b8152600401610730906127b2565b6001600160a01b03166000908152600960205260409020805460ff19169055565b3360009081526009602052604090205460ff1680610b8857506003546001600160a01b031633145b610ba45760405162461bcd60e51b8152600401610730906127b2565b600b55565b3360009081526009602052604081205460ff1680610bd157506003546001600160a01b031633145b610bed5760405162461bcd60e51b8152600401610730906127b2565b506001600160a01b03811660009081526009602052604090205460ff165b919050565b3360009081526009602052604090205460ff1680610c3857506003546001600160a01b031633145b610c545760405162461bcd60e51b8152600401610730906127b2565b600c805460ff19166001179055565b6001600160a01b038516331480610c7f5750610c7f853361063a565b610ce65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610730565b610cf38585858585611951565b5050505050565b6003546001600160a01b03163314610d245760405162461bcd60e51b8152600401610730906127f6565b60004711610d745760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c642062652067726561746572207468616e20306044820152606401610730565b6003546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dad573d6000803e3d6000fd5b50565b6003546001600160a01b03163314610dda5760405162461bcd60e51b8152600401610730906127f6565b6003546001600160a01b0316331415610dfb576003546001600160a01b0316ff5b565b60608151835114610e625760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610730565b6000835167ffffffffffffffff811115610e7e57610e7e6121ba565b604051908082528060200260200182016040528015610ea7578160200160208202803683370190505b50905060005b8451811015610f1f57610ef2858281518110610ecb57610ecb612784565b6020026020010151858381518110610ee557610ee5612784565b60200260200101516106c8565b828281518110610f0457610f04612784565b6020908102919091010152610f188161282b565b9050610ead565b509392505050565b3360009081526009602052604090205460ff1680610f4f57506003546001600160a01b031633145b610f6b5760405162461bcd60e51b8152600401610730906127b2565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6003546001600160a01b03163314610fb95760405162461bcd60e51b8152600401610730906127f6565b610dfb6000611b2e565b3360009081526009602052604090205460ff1680610feb57506003546001600160a01b031633145b6110075760405162461bcd60e51b8152600401610730906127b2565b600082116110575760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e49642073686f756c6420626520686967686572207468616e2030006044820152606401610730565b6000918252600a602052604090912055565b3360009081526009602052604090205460ff168061109157506003546001600160a01b031633145b6110ad5760405162461bcd60e51b8152600401610730906127b2565b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b3360009081526009602052604090205460ff168061110a57506003546001600160a01b031633145b6111265760405162461bcd60e51b8152600401610730906127b2565b600c805460ff19169055565b600f80546107be90612645565b3360009081526009602052604090205460609060ff168061116a57506003546001600160a01b031633145b6111865760405162461bcd60e51b8152600401610730906127b2565b60058054806020026020016040519081016040528092919081815260200182805480156111d257602002820191906000526020600020905b8154815260200190600101908083116111be575b505050505090505b90565b3360009081526009602052604090205460ff168061120557506003546001600160a01b031633145b6112215760405162461bcd60e51b8152600401610730906127b2565b805161123490600d906020840190611fed565b5050565b611234338383611b80565b6000600461125260018461276d565b8154811061126257611262612784565b90600052602060002001549050919050565b3360009081526009602052604090205460ff168061129c57506003546001600160a01b031633145b6112b85760405162461bcd60e51b8152600401610730906127b2565b600083116113085760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e49642073686f756c6420626520686967686572207468616e2030006044820152606401610730565b60045483111561134c57600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01829055611377565b81600461135a60018661276d565b8154811061136a5761136a612784565b6000918252602090912001555b8015610af657610af683600061164e565b3360009081526009602052604090205460ff16806113b057506003546001600160a01b031633145b6113cc5760405162461bcd60e51b8152600401610730906127b2565b610dfb60056000612071565b60055460009061141c5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e4819195c1b195d1959608a1b6044820152606401610730565b6005546000906114846040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152600090819060a80160408051601f19818403018152919052805160209091012092915050565b61148e919061285c565b90506000600582815481106114a5576114a5612784565b90600052602060002001549050600560016005805490506114c6919061276d565b815481106114d6576114d6612784565b9060005260206000200154600583815481106114f4576114f4612784565b600091825260209091200155600580548061151157611511612870565b60019003818190600052602060002001600090559055809250505090565b6001600160a01b03851633148061154b575061154b853361063a565b6115a95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610730565b610cf38585858585611c61565b6003546001600160a01b031633146115e05760405162461bcd60e51b8152600401610730906127f6565b6001600160a01b0381166116455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610730565b610dad81611b2e565b3360009081526009602052604090205460ff168061167657506003546001600160a01b031633145b6116925760405162461bcd60e51b8152600401610730906127b2565b600081156116a057816116c9565b60046116ad60018561276d565b815481106116bd576116bd612784565b90600052602060002001545b90506000816006546116db919061279a565b6006555060005b818110156117315760058054600181810183556000929092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00185905561172a908261279a565b90506116e2565b50505050565b60608161175b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611785578061176f8161282b565b915061177e9050600a83612886565b915061175f565b60008167ffffffffffffffff8111156117a0576117a06121ba565b6040519080825280601f01601f1916602001820160405280156117ca576020820181803683370190505b5090505b8415611835576117df60018361276d565b91506117ec600a8661285c565b6117f790603061279a565b60f81b81838151811061180c5761180c612784565b60200101906001600160f81b031916908160001a90535061182e600a86612886565b94506117ce565b949350505050565b6001600160a01b03841661189d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610730565b3360006118a985611d8b565b905060006118b685611d8b565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906118e890849061279a565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461194883600089898989611dd6565b50505050505050565b81518351146119b35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610730565b6001600160a01b0384166119d95760405162461bcd60e51b81526004016107309061289a565b3360005b8451811015611ac05760008582815181106119fa576119fa612784565b602002602001015190506000858381518110611a1857611a18612784565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a685760405162461bcd60e51b8152600401610730906128df565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611aa590849061279a565b9250508190555050505080611ab99061282b565b90506119dd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b10929190612929565b60405180910390a4611b26818787878787611f32565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611bf45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610730565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c875760405162461bcd60e51b81526004016107309061289a565b336000611c9385611d8b565b90506000611ca085611d8b565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611ce35760405162461bcd60e51b8152600401610730906128df565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611d2090849061279a565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d80848a8a8a8a8a611dd6565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611dc557611dc5612784565b602090810291909101015292915050565b6001600160a01b0384163b15611b265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e1a908990899088908890889060040161294e565b6020604051808303816000875af1925050508015611e55575060408051601f3d908101601f19168201909252611e5291810190612993565b60015b611f0257611e616129b0565b806308c379a01415611e9b5750611e766129cb565b80611e815750611e9d565b8060405162461bcd60e51b81526004016107309190612173565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610730565b6001600160e01b0319811663f23a6e6160e01b146119485760405162461bcd60e51b815260040161073090612a55565b6001600160a01b0384163b15611b265760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611f769089908990889088908890600401612a9d565b6020604051808303816000875af1925050508015611fb1575060408051601f3d908101601f19168201909252611fae91810190612993565b60015b611fbd57611e616129b0565b6001600160e01b0319811663bc197c8160e01b146119485760405162461bcd60e51b815260040161073090612a55565b828054611ff990612645565b90600052602060002090601f01602090048101928261201b5760008555612061565b82601f1061203457805160ff1916838001178555612061565b82800160010185558215612061579182015b82811115612061578251825591602001919060010190612046565b5061206d92915061208b565b5090565b5080546000825590600052602060002090810190610dad91905b5b8082111561206d576000815560010161208c565b80356001600160a01b0381168114610c0b57600080fd5b600080604083850312156120ca57600080fd5b6120d3836120a0565b946020939093013593505050565b6001600160e01b031981168114610dad57600080fd5b60006020828403121561210957600080fd5b8135612114816120e1565b9392505050565b60005b8381101561213657818101518382015260200161211e565b838111156117315750506000910152565b6000815180845261215f81602086016020860161211b565b601f01601f19169290920160200192915050565b6020815260006121146020830184612147565b60006020828403121561219857600080fd5b5035919050565b6000602082840312156121b157600080fd5b612114826120a0565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156121f6576121f66121ba565b6040525050565b600067ffffffffffffffff821115612217576122176121ba565b5060051b60200190565b600082601f83011261223257600080fd5b8135602061223f826121fd565b60405161224c82826121d0565b83815260059390931b850182019282810191508684111561226c57600080fd5b8286015b848110156122875780358352918301918301612270565b509695505050505050565b600067ffffffffffffffff8311156122ac576122ac6121ba565b6040516122c3601f8501601f1916602001826121d0565b8091508381528484840111156122d857600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261230157600080fd5b61211483833560208501612292565b600080600080600060a0868803121561232857600080fd5b612331866120a0565b945061233f602087016120a0565b9350604086013567ffffffffffffffff8082111561235c57600080fd5b61236889838a01612221565b9450606088013591508082111561237e57600080fd5b61238a89838a01612221565b935060808801359150808211156123a057600080fd5b506123ad888289016122f0565b9150509295509295909350565b600080604083850312156123cd57600080fd5b823567ffffffffffffffff808211156123e557600080fd5b818501915085601f8301126123f957600080fd5b81356020612406826121fd565b60405161241382826121d0565b83815260059390931b850182019282810191508984111561243357600080fd5b948201945b8386101561245857612449866120a0565b82529482019490820190612438565b9650508601359250508082111561246e57600080fd5b5061247b85828601612221565b9150509250929050565b600081518084526020808501945080840160005b838110156124b557815187529582019590820190600101612499565b509495945050505050565b6020815260006121146020830184612485565b600080604083850312156124e657600080fd5b50508035926020909101359150565b60006020828403121561250757600080fd5b813567ffffffffffffffff81111561251e57600080fd5b8201601f8101841361252f57600080fd5b61183584823560208401612292565b80358015158114610c0b57600080fd5b6000806040838503121561256157600080fd5b61256a836120a0565b91506125786020840161253e565b90509250929050565b60008060006060848603121561259657600080fd5b83359250602084013591506125ad6040850161253e565b90509250925092565b600080604083850312156125c957600080fd5b6125d2836120a0565b9150612578602084016120a0565b600080600080600060a086880312156125f857600080fd5b612601866120a0565b945061260f602087016120a0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561263957600080fd5b6123ad888289016122f0565b600181811c9082168061265957607f821691505b6020821081141561267a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000815161269281856020860161211b565b9290920192915050565b600080845481600182811c9150808316806126b857607f831692505b60208084108214156126d857634e487b7160e01b86526022600452602486fd5b8180156126ec57600181146126fd5761272a565b60ff1986168952848901965061272a565b60008b81526020902060005b868110156127225781548b820152908501908301612709565b505084890196505b50505050505061274e61273d8286612680565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561277f5761277f612757565b500390565b634e487b7160e01b600052603260045260246000fd5b600082198211156127ad576127ad612757565b500190565b60208082526024908201527f4f6e6c792061646d696e732063616e2061636365737320746869732066756e636040820152633a34b7b760e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060001982141561283f5761283f612757565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261286b5761286b612846565b500690565b634e487b7160e01b600052603160045260246000fd5b60008261289557612895612846565b500490565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061293c6040830185612485565b828103602084015261274e8185612485565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061298890830184612147565b979650505050505050565b6000602082840312156129a557600080fd5b8151612114816120e1565b600060033d11156111da5760046000803e5060005160e01c90565b600060443d10156129d95790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612a0957505050505090565b8285019150815181811115612a215750505050505090565b843d8701016020828501011115612a3b5750505050505090565b612a4a602082860101876121d0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612ac990830186612485565b8281036060840152612adb8186612485565b90508281036080840152612aef8185612147565b9897505050505050505056fea2646970667358221220e8486fca8003546437e2aca177960a557e611cc73dadb1f93c92125f41dd620464736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102195760003560e01c8063778ef13d11610123578063bd85b039116100ab578063e4b7fb731161006f578063e4b7fb731461060a578063e985e9c51461061f578063f242432a14610668578063f2fde38b14610688578063fbb2e4da146106a857600080fd5b8063bd85b03914610573578063cdb9762e14610593578063d445b978146105b3578063d586b9d1146105e0578063d605787b146105f557600080fd5b806395d89b41116100f257806395d89b41146104cd5780639b6d8323146104e2578063a0bcfc7f146104f7578063a22cb46514610517578063adcb55231461053757600080fd5b8063778ef13d146104435780637dc0bf3f146104635780638da5cb5b146104905780638ec280cf146104b857600080fd5b80632eb2c2d6116101a65780634e1273f4116101755780634e1273f4146103ac5780636c9c2faf146103d957806370480275146103ee578063715018a61461040e5780637696e0881461042357600080fd5b80632eb2c2d6146103425780633ccfd60b1461036257806341c0e1b51461037757806349b3b29f1461037f57600080fd5b80631249c58b116101ed5780631249c58b146102c35780631785f53c146102cd5780631e14d44b146102ed57806324d7806c1461030d57806326e41dd81461032d57600080fd5b8062fdd58e1461021e57806301ffc9a71461025157806306fdde03146102815780630e89341c146102a3575b600080fd5b34801561022a57600080fd5b5061023e6102393660046120b7565b6106c8565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046120f7565b61075f565b6040519015158152602001610248565b34801561028d57600080fd5b506102966107b1565b6040516102489190612173565b3480156102af57600080fd5b506102966102be366004612186565b61083f565b6102cb610873565b005b3480156102d957600080fd5b506102cb6102e836600461219f565b610afb565b3480156102f957600080fd5b506102cb610308366004612186565b610b60565b34801561031957600080fd5b5061027161032836600461219f565b610ba9565b34801561033957600080fd5b506102cb610c10565b34801561034e57600080fd5b506102cb61035d366004612310565b610c63565b34801561036e57600080fd5b506102cb610cfa565b6102cb610db0565b34801561038b57600080fd5b5061023e61039a366004612186565b600a6020526000908152604090205481565b3480156103b857600080fd5b506103cc6103c73660046123ba565b610dfd565b60405161024891906124c0565b3480156103e557600080fd5b5060065461023e565b3480156103fa57600080fd5b506102cb61040936600461219f565b610f27565b34801561041a57600080fd5b506102cb610f8f565b34801561042f57600080fd5b506102cb61043e3660046124d3565b610fc3565b34801561044f57600080fd5b506102cb61045e366004612186565b611069565b34801561046f57600080fd5b5061023e61047e366004612186565b60086020526000908152604090205481565b34801561049c57600080fd5b506003546040516001600160a01b039091168152602001610248565b3480156104c457600080fd5b506102cb6110e2565b3480156104d957600080fd5b50610296611132565b3480156104ee57600080fd5b506103cc61113f565b34801561050357600080fd5b506102cb6105123660046124f5565b6111dd565b34801561052357600080fd5b506102cb61053236600461254e565b611238565b34801561054357600080fd5b5061027161055236600461219f565b600b546001600160a01b039091166000908152600760205260409020541090565b34801561057f57600080fd5b5061023e61058e366004612186565b611243565b34801561059f57600080fd5b506102cb6105ae366004612581565b611274565b3480156105bf57600080fd5b5061023e6105ce36600461219f565b60076020526000908152604090205481565b3480156105ec57600080fd5b506102cb611388565b34801561060157600080fd5b5061023e6113d8565b34801561061657600080fd5b5060055461023e565b34801561062b57600080fd5b5061027161063a3660046125b6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561067457600080fd5b506102cb6106833660046125e0565b61152f565b34801561069457600080fd5b506102cb6106a336600461219f565b6115b6565b3480156106b457600080fd5b506102cb6106c33660046124d3565b61164e565b60006001600160a01b0383166107395760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061079057506001600160e01b031982166303a24d0760e21b145b806107ab57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600e80546107be90612645565b80601f01602080910402602001604051908101604052809291908181526020018280546107ea90612645565b80156108375780601f1061080c57610100808354040283529160200191610837565b820191906000526020600020905b81548152906001019060200180831161081a57829003601f168201915b505050505081565b6060600d61084c83611737565b60405160200161085d92919061269c565b6040516020818303038152906040529050919050565b600061087d6113d8565b9050600061088c60018361276d565b600b5433600090815260076020526040902054600c54929350109060ff166108ef5760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401610730565b600083116109365760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610730565b6004548311156109805760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20646f6573206e6f742065786973747360581b6044820152606401610730565b6004828154811061099357610993612784565b90600052602060002001546008600084815260200190815260200160002054106109f55760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f75676820737570706c69657360681b6044820152606401610730565b6000828152600a6020526040902054341015610a475760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682065746865727360781b6044820152606401610730565b80610a8a5760405162461bcd60e51b8152602060048201526013602482015272115e18d959591959081b5a5b9d081b1a5b5a5d606a1b6044820152606401610730565b8015610af657610aac338460016040518060200160405280600081525061183d565b336000908152600760205260408120805460019290610acc90849061279a565b90915550506000828152600860205260408120805460019290610af090849061279a565b90915550505b505050565b3360009081526009602052604090205460ff1680610b2357506003546001600160a01b031633145b610b3f5760405162461bcd60e51b8152600401610730906127b2565b6001600160a01b03166000908152600960205260409020805460ff19169055565b3360009081526009602052604090205460ff1680610b8857506003546001600160a01b031633145b610ba45760405162461bcd60e51b8152600401610730906127b2565b600b55565b3360009081526009602052604081205460ff1680610bd157506003546001600160a01b031633145b610bed5760405162461bcd60e51b8152600401610730906127b2565b506001600160a01b03811660009081526009602052604090205460ff165b919050565b3360009081526009602052604090205460ff1680610c3857506003546001600160a01b031633145b610c545760405162461bcd60e51b8152600401610730906127b2565b600c805460ff19166001179055565b6001600160a01b038516331480610c7f5750610c7f853361063a565b610ce65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610730565b610cf38585858585611951565b5050505050565b6003546001600160a01b03163314610d245760405162461bcd60e51b8152600401610730906127f6565b60004711610d745760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c642062652067726561746572207468616e20306044820152606401610730565b6003546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dad573d6000803e3d6000fd5b50565b6003546001600160a01b03163314610dda5760405162461bcd60e51b8152600401610730906127f6565b6003546001600160a01b0316331415610dfb576003546001600160a01b0316ff5b565b60608151835114610e625760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610730565b6000835167ffffffffffffffff811115610e7e57610e7e6121ba565b604051908082528060200260200182016040528015610ea7578160200160208202803683370190505b50905060005b8451811015610f1f57610ef2858281518110610ecb57610ecb612784565b6020026020010151858381518110610ee557610ee5612784565b60200260200101516106c8565b828281518110610f0457610f04612784565b6020908102919091010152610f188161282b565b9050610ead565b509392505050565b3360009081526009602052604090205460ff1680610f4f57506003546001600160a01b031633145b610f6b5760405162461bcd60e51b8152600401610730906127b2565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6003546001600160a01b03163314610fb95760405162461bcd60e51b8152600401610730906127f6565b610dfb6000611b2e565b3360009081526009602052604090205460ff1680610feb57506003546001600160a01b031633145b6110075760405162461bcd60e51b8152600401610730906127b2565b600082116110575760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e49642073686f756c6420626520686967686572207468616e2030006044820152606401610730565b6000918252600a602052604090912055565b3360009081526009602052604090205460ff168061109157506003546001600160a01b031633145b6110ad5760405162461bcd60e51b8152600401610730906127b2565b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b3360009081526009602052604090205460ff168061110a57506003546001600160a01b031633145b6111265760405162461bcd60e51b8152600401610730906127b2565b600c805460ff19169055565b600f80546107be90612645565b3360009081526009602052604090205460609060ff168061116a57506003546001600160a01b031633145b6111865760405162461bcd60e51b8152600401610730906127b2565b60058054806020026020016040519081016040528092919081815260200182805480156111d257602002820191906000526020600020905b8154815260200190600101908083116111be575b505050505090505b90565b3360009081526009602052604090205460ff168061120557506003546001600160a01b031633145b6112215760405162461bcd60e51b8152600401610730906127b2565b805161123490600d906020840190611fed565b5050565b611234338383611b80565b6000600461125260018461276d565b8154811061126257611262612784565b90600052602060002001549050919050565b3360009081526009602052604090205460ff168061129c57506003546001600160a01b031633145b6112b85760405162461bcd60e51b8152600401610730906127b2565b600083116113085760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e49642073686f756c6420626520686967686572207468616e2030006044820152606401610730565b60045483111561134c57600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01829055611377565b81600461135a60018661276d565b8154811061136a5761136a612784565b6000918252602090912001555b8015610af657610af683600061164e565b3360009081526009602052604090205460ff16806113b057506003546001600160a01b031633145b6113cc5760405162461bcd60e51b8152600401610730906127b2565b610dfb60056000612071565b60055460009061141c5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e4819195c1b195d1959608a1b6044820152606401610730565b6005546000906114846040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152600090819060a80160408051601f19818403018152919052805160209091012092915050565b61148e919061285c565b90506000600582815481106114a5576114a5612784565b90600052602060002001549050600560016005805490506114c6919061276d565b815481106114d6576114d6612784565b9060005260206000200154600583815481106114f4576114f4612784565b600091825260209091200155600580548061151157611511612870565b60019003818190600052602060002001600090559055809250505090565b6001600160a01b03851633148061154b575061154b853361063a565b6115a95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610730565b610cf38585858585611c61565b6003546001600160a01b031633146115e05760405162461bcd60e51b8152600401610730906127f6565b6001600160a01b0381166116455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610730565b610dad81611b2e565b3360009081526009602052604090205460ff168061167657506003546001600160a01b031633145b6116925760405162461bcd60e51b8152600401610730906127b2565b600081156116a057816116c9565b60046116ad60018561276d565b815481106116bd576116bd612784565b90600052602060002001545b90506000816006546116db919061279a565b6006555060005b818110156117315760058054600181810183556000929092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00185905561172a908261279a565b90506116e2565b50505050565b60608161175b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611785578061176f8161282b565b915061177e9050600a83612886565b915061175f565b60008167ffffffffffffffff8111156117a0576117a06121ba565b6040519080825280601f01601f1916602001820160405280156117ca576020820181803683370190505b5090505b8415611835576117df60018361276d565b91506117ec600a8661285c565b6117f790603061279a565b60f81b81838151811061180c5761180c612784565b60200101906001600160f81b031916908160001a90535061182e600a86612886565b94506117ce565b949350505050565b6001600160a01b03841661189d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610730565b3360006118a985611d8b565b905060006118b685611d8b565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906118e890849061279a565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461194883600089898989611dd6565b50505050505050565b81518351146119b35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610730565b6001600160a01b0384166119d95760405162461bcd60e51b81526004016107309061289a565b3360005b8451811015611ac05760008582815181106119fa576119fa612784565b602002602001015190506000858381518110611a1857611a18612784565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a685760405162461bcd60e51b8152600401610730906128df565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611aa590849061279a565b9250508190555050505080611ab99061282b565b90506119dd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b10929190612929565b60405180910390a4611b26818787878787611f32565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611bf45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610730565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c875760405162461bcd60e51b81526004016107309061289a565b336000611c9385611d8b565b90506000611ca085611d8b565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015611ce35760405162461bcd60e51b8152600401610730906128df565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611d2090849061279a565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d80848a8a8a8a8a611dd6565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611dc557611dc5612784565b602090810291909101015292915050565b6001600160a01b0384163b15611b265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e1a908990899088908890889060040161294e565b6020604051808303816000875af1925050508015611e55575060408051601f3d908101601f19168201909252611e5291810190612993565b60015b611f0257611e616129b0565b806308c379a01415611e9b5750611e766129cb565b80611e815750611e9d565b8060405162461bcd60e51b81526004016107309190612173565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610730565b6001600160e01b0319811663f23a6e6160e01b146119485760405162461bcd60e51b815260040161073090612a55565b6001600160a01b0384163b15611b265760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611f769089908990889088908890600401612a9d565b6020604051808303816000875af1925050508015611fb1575060408051601f3d908101601f19168201909252611fae91810190612993565b60015b611fbd57611e616129b0565b6001600160e01b0319811663bc197c8160e01b146119485760405162461bcd60e51b815260040161073090612a55565b828054611ff990612645565b90600052602060002090601f01602090048101928261201b5760008555612061565b82601f1061203457805160ff1916838001178555612061565b82800160010185558215612061579182015b82811115612061578251825591602001919060010190612046565b5061206d92915061208b565b5090565b5080546000825590600052602060002090810190610dad91905b5b8082111561206d576000815560010161208c565b80356001600160a01b0381168114610c0b57600080fd5b600080604083850312156120ca57600080fd5b6120d3836120a0565b946020939093013593505050565b6001600160e01b031981168114610dad57600080fd5b60006020828403121561210957600080fd5b8135612114816120e1565b9392505050565b60005b8381101561213657818101518382015260200161211e565b838111156117315750506000910152565b6000815180845261215f81602086016020860161211b565b601f01601f19169290920160200192915050565b6020815260006121146020830184612147565b60006020828403121561219857600080fd5b5035919050565b6000602082840312156121b157600080fd5b612114826120a0565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156121f6576121f66121ba565b6040525050565b600067ffffffffffffffff821115612217576122176121ba565b5060051b60200190565b600082601f83011261223257600080fd5b8135602061223f826121fd565b60405161224c82826121d0565b83815260059390931b850182019282810191508684111561226c57600080fd5b8286015b848110156122875780358352918301918301612270565b509695505050505050565b600067ffffffffffffffff8311156122ac576122ac6121ba565b6040516122c3601f8501601f1916602001826121d0565b8091508381528484840111156122d857600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261230157600080fd5b61211483833560208501612292565b600080600080600060a0868803121561232857600080fd5b612331866120a0565b945061233f602087016120a0565b9350604086013567ffffffffffffffff8082111561235c57600080fd5b61236889838a01612221565b9450606088013591508082111561237e57600080fd5b61238a89838a01612221565b935060808801359150808211156123a057600080fd5b506123ad888289016122f0565b9150509295509295909350565b600080604083850312156123cd57600080fd5b823567ffffffffffffffff808211156123e557600080fd5b818501915085601f8301126123f957600080fd5b81356020612406826121fd565b60405161241382826121d0565b83815260059390931b850182019282810191508984111561243357600080fd5b948201945b8386101561245857612449866120a0565b82529482019490820190612438565b9650508601359250508082111561246e57600080fd5b5061247b85828601612221565b9150509250929050565b600081518084526020808501945080840160005b838110156124b557815187529582019590820190600101612499565b509495945050505050565b6020815260006121146020830184612485565b600080604083850312156124e657600080fd5b50508035926020909101359150565b60006020828403121561250757600080fd5b813567ffffffffffffffff81111561251e57600080fd5b8201601f8101841361252f57600080fd5b61183584823560208401612292565b80358015158114610c0b57600080fd5b6000806040838503121561256157600080fd5b61256a836120a0565b91506125786020840161253e565b90509250929050565b60008060006060848603121561259657600080fd5b83359250602084013591506125ad6040850161253e565b90509250925092565b600080604083850312156125c957600080fd5b6125d2836120a0565b9150612578602084016120a0565b600080600080600060a086880312156125f857600080fd5b612601866120a0565b945061260f602087016120a0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561263957600080fd5b6123ad888289016122f0565b600181811c9082168061265957607f821691505b6020821081141561267a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000815161269281856020860161211b565b9290920192915050565b600080845481600182811c9150808316806126b857607f831692505b60208084108214156126d857634e487b7160e01b86526022600452602486fd5b8180156126ec57600181146126fd5761272a565b60ff1986168952848901965061272a565b60008b81526020902060005b868110156127225781548b820152908501908301612709565b505084890196505b50505050505061274e61273d8286612680565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561277f5761277f612757565b500390565b634e487b7160e01b600052603260045260246000fd5b600082198211156127ad576127ad612757565b500190565b60208082526024908201527f4f6e6c792061646d696e732063616e2061636365737320746869732066756e636040820152633a34b7b760e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060001982141561283f5761283f612757565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261286b5761286b612846565b500690565b634e487b7160e01b600052603160045260246000fd5b60008261289557612895612846565b500490565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061293c6040830185612485565b828103602084015261274e8185612485565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061298890830184612147565b979650505050505050565b6000602082840312156129a557600080fd5b8151612114816120e1565b600060033d11156111da5760046000803e5060005160e01c90565b600060443d10156129d95790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612a0957505050505090565b8285019150815181811115612a215750505050505090565b843d8701016020828501011115612a3b5750505050505090565b612a4a602082860101876121d0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612ac990830186612485565b8281036060840152612adb8186612485565b90508281036080840152612aef8185612147565b9897505050505050505056fea2646970667358221220e8486fca8003546437e2aca177960a557e611cc73dadb1f93c92125f41dd620464736f6c634300080c0033
Deployed Bytecode Sourcemap
41012:6726:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20904:231;;;;;;;;;;-1:-1:-1;20904:231:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;20904:231:0;;;;;;;;19927:310;;;;;;;;;;-1:-1:-1;19927:310:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;19927:310:0;1019:187:1;41760:26:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47427:308::-;;;;;;;;;;-1:-1:-1;47427:308:0;;;;;:::i;:::-;;:::i;44238:700::-;;;:::i;:::-;;42746:93;;;;;;;;;;-1:-1:-1;42746:93:0;;;;;:::i;:::-;;:::i;42390:132::-;;;;;;;;;;-1:-1:-1;42390:132:0;;;;;:::i;:::-;;:::i;42534:107::-;;;;;;;;;;-1:-1:-1;42534:107:0;;;;;:::i;:::-;;:::i;47265:72::-;;;;;;;;;;;;;:::i;22843:442::-;;;;;;;;;;-1:-1:-1;22843:442:0;;;;;:::i;:::-;;:::i;47072:185::-;;;;;;;;;;;;;:::i;46947:117::-;;;:::i;41622:40::-;;;;;;;;;;-1:-1:-1;41622:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;21301:524;;;;;;;;;;-1:-1:-1;21301:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45230:98::-;;;;;;;;;;-1:-1:-1;45301:19:0;;45230:98;;42649:89;;;;;;;;;;-1:-1:-1;42649:89:0;;;;;:::i;:::-;;:::i;37998:103::-;;;;;;;;;;;;;:::i;44058:172::-;;;;;;;;;;-1:-1:-1;44058:172:0;;;;;:::i;:::-;;:::i;43415:119::-;;;;;;;;;;-1:-1:-1;43415:119:0;;;;;:::i;:::-;;:::i;41528:41::-;;;;;;;;;;-1:-1:-1;41528:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;37347:87;;;;;;;;;;-1:-1:-1;37420:6:0;;37347:87;;-1:-1:-1;;;;;37420:6:0;;;7627:51:1;;7615:2;7600:18;37347:87:0;7481:203:1;47345:74:0;;;;;;;;;;;;;:::i;41793:28::-;;;;;;;;;;;;;:::i;43542:113::-;;;;;;;;;;;;;:::i;42847:98::-;;;;;;;;;;-1:-1:-1;42847:98:0;;;;;:::i;:::-;;:::i;21898:155::-;;;;;;;;;;-1:-1:-1;21898:155:0;;;;;:::i;:::-;;:::i;44950:138::-;;;;;;;;;;-1:-1:-1;44950:138:0;;;;;:::i;:::-;45063:17;;-1:-1:-1;;;;;45037:23:0;;;45013:4;45037:23;;;:16;:23;;;;;;:43;;44950:138;45096:122;;;;;;;;;;-1:-1:-1;45096:122:0;;;;;:::i;:::-;;:::i;43663:387::-;;;;;;;;;;-1:-1:-1;43663:387:0;;;;;:::i;:::-;;:::i;41470:51::-;;;;;;;;;;-1:-1:-1;41470:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;42953:81;;;;;;;;;;;;;:::i;46100:839::-;;;;;;;;;;;;;:::i;45336:106::-;;;;;;;;;;-1:-1:-1;45413:14:0;:21;45336:106;;22125:168;;;;;;;;;;-1:-1:-1;22125:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;22248:27:0;;;22224:4;22248:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22125:168;22365:401;;;;;;;;;;-1:-1:-1;22365:401:0;;;;;:::i;:::-;;:::i;38256:201::-;;;;;;;;;;-1:-1:-1;38256:201:0;;;;;:::i;:::-;;:::i;43042:365::-;;;;;;;;;;-1:-1:-1;43042:365:0;;;;;:::i;:::-;;:::i;20904:231::-;20990:7;-1:-1:-1;;;;;21018:21:0;;21010:77;;;;-1:-1:-1;;;21010:77:0;;9967:2:1;21010:77:0;;;9949:21:1;10006:2;9986:18;;;9979:30;10045:34;10025:18;;;10018:62;-1:-1:-1;;;10096:18:1;;;10089:41;10147:19;;21010:77:0;;;;;;;;;-1:-1:-1;21105:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21105:22:0;;;;;;;;;;;;20904:231::o;19927:310::-;20029:4;-1:-1:-1;;;;;;20066:41:0;;-1:-1:-1;;;20066:41:0;;:110;;-1:-1:-1;;;;;;;20124:52:0;;-1:-1:-1;;;20124:52:0;20066:110;:163;;;-1:-1:-1;;;;;;;;;;18779:40:0;;;20193:36;20046:183;19927:310;-1:-1:-1;;19927:310:0:o;41760:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47427:308::-;47486:13;47597:7;47627:25;47644:7;47627:16;:25::i;:::-;47558:143;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47511:216;;47427:308;;;:::o;44238:700::-;44282:10;44295:5;:3;:5::i;:::-;44282:18;-1:-1:-1;44311:13:0;44327:6;44332:1;44282:18;44327:6;:::i;:::-;45063:17;;44383:10;44344:17;45037:23;;;:16;:23;;;;;;44413:7;;44311:22;;-1:-1:-1;45037:43:0;;44413:7;;44405:42;;;;-1:-1:-1;;;44405:42:0;;12766:2:1;44405:42:0;;;12748:21:1;12805:2;12785:18;;;12778:30;-1:-1:-1;;;12824:18:1;;;12817:52;12886:18;;44405:42:0;12564:346:1;44405:42:0;44471:1;44466:2;:6;44458:39;;;;-1:-1:-1;;;44458:39:0;;13117:2:1;44458:39:0;;;13099:21:1;13156:2;13136:18;;;13129:30;-1:-1:-1;;;13175:18:1;;;13168:50;13235:18;;44458:39:0;12915:344:1;44458:39:0;44522:8;:15;44516:21;;;44508:55;;;;-1:-1:-1;;;44508:55:0;;13466:2:1;44508:55:0;;;13448:21:1;13505:2;13485:18;;;13478:30;-1:-1:-1;;;13524:18:1;;;13517:51;13585:18;;44508:55:0;13264:345:1;44508:55:0;44598:8;44607:5;44598:15;;;;;;;;:::i;:::-;;;;;;;;;44582:6;:13;44589:5;44582:13;;;;;;;;;;;;:31;44574:63;;;;-1:-1:-1;;;44574:63:0;;13948:2:1;44574:63:0;;;13930:21:1;13987:2;13967:18;;;13960:30;-1:-1:-1;;;14006:18:1;;;13999:49;14065:18;;44574:63:0;13746:343:1;44574:63:0;44669:12;;;;:5;:12;;;;;;44656:9;:25;;44648:55;;;;-1:-1:-1;;;44648:55:0;;14296:2:1;44648:55:0;;;14278:21:1;14335:2;14315:18;;;14308:30;-1:-1:-1;;;14354:18:1;;;14347:47;14411:18;;44648:55:0;14094:341:1;44648:55:0;44722:12;44714:43;;;;-1:-1:-1;;;44714:43:0;;14642:2:1;44714:43:0;;;14624:21:1;14681:2;14661:18;;;14654:30;-1:-1:-1;;;14700:18:1;;;14693:49;14759:18;;44714:43:0;14440:343:1;44714:43:0;44782:12;44778:153;;;44810:28;44816:10;44828:2;44832:1;44810:28;;;;;;;;;;;;:5;:28::i;:::-;44870:10;44853:28;;;;:16;:28;;;;;:33;;44885:1;;44853:28;:33;;44885:1;;44853:33;:::i;:::-;;;;-1:-1:-1;;44901:13:0;;;;:6;:13;;;;;:18;;44918:1;;44901:13;:18;;44918:1;;44901:18;:::i;:::-;;;;-1:-1:-1;;44778:153:0;44271:667;;;44238:700::o;42746:93::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42810:13:0::1;42826:5;42810:13:::0;;;:6:::1;:13;::::0;;;;:21;;-1:-1:-1;;42810:21:0::1;::::0;;42746:93::o;42390:132::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;42476:17:::1;:38:::0;42390:132::o;42534:107::-;42286:10;42596:4;42279:18;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;42620:13:0;::::1;;::::0;;;:6:::1;:13;::::0;;;;;::::1;;42373:1;42534:107:::0;;;:::o;47265:72::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;47315:7:::1;:14:::0;;-1:-1:-1;;47315:14:0::1;47325:4;47315:14;::::0;;47265:72::o;22843:442::-;-1:-1:-1;;;;;23076:20:0;;17670:10;23076:20;;:60;;-1:-1:-1;23100:36:0;23117:4;17670:10;22125:168;:::i;23100:36::-;23054:160;;;;-1:-1:-1;;;23054:160:0;;15528:2:1;23054:160:0;;;15510:21:1;15567:2;15547:18;;;15540:30;15606:34;15586:18;;;15579:62;-1:-1:-1;;;15657:18:1;;;15650:48;15715:19;;23054:160:0;15326:414:1;23054:160:0;23225:52;23248:4;23254:2;23258:3;23263:7;23272:4;23225:22;:52::i;:::-;22843:442;;;;;:::o;47072:185::-;37420:6;;-1:-1:-1;;;;;37420:6:0;17670:10;37567:23;37559:68;;;;-1:-1:-1;;;37559:68:0;;;;;;;:::i;:::-;47152:1:::1;47128:21;:25;47120:70;;;::::0;-1:-1:-1;;;47120:70:0;;16308:2:1;47120:70:0::1;::::0;::::1;16290:21:1::0;;;16327:18;;;16320:30;16386:34;16366:18;;;16359:62;16438:18;;47120:70:0::1;16106:356:1::0;47120:70:0::1;37420:6:::0;;47201:48:::1;::::0;-1:-1:-1;;;;;37420:6:0;;;;47227:21:::1;47201:48:::0;::::1;;;::::0;::::1;::::0;;;47227:21;37420:6;47201:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47072:185::o:0;46947:117::-;37420:6;;-1:-1:-1;;;;;37420:6:0;17670:10;37567:23;37559:68;;;;-1:-1:-1;;;37559:68:0;;;;;;;:::i;:::-;37420:6;;-1:-1:-1;;;;;37420:6:0;47003:10:::1;:21;46999:57;;;37420:6:::0;;-1:-1:-1;;;;;37420:6:0;47026:30:::1;46999:57;46947:117::o:0;21301:524::-;21457:16;21518:3;:10;21499:8;:15;:29;21491:83;;;;-1:-1:-1;;;21491:83:0;;16669:2:1;21491:83:0;;;16651:21:1;16708:2;16688:18;;;16681:30;16747:34;16727:18;;;16720:62;-1:-1:-1;;;16798:18:1;;;16791:39;16847:19;;21491:83:0;16467:405:1;21491:83:0;21587:30;21634:8;:15;21620:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21620:30:0;;21587:63;;21668:9;21663:122;21687:8;:15;21683:1;:19;21663:122;;;21743:30;21753:8;21762:1;21753:11;;;;;;;;:::i;:::-;;;;;;;21766:3;21770:1;21766:6;;;;;;;;:::i;:::-;;;;;;;21743:9;:30::i;:::-;21724:13;21738:1;21724:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;21704:3;;;:::i;:::-;;;21663:122;;;-1:-1:-1;21804:13:0;21301:524;-1:-1:-1;;;21301:524:0:o;42649:89::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42710:13:0::1;;::::0;;;:6:::1;:13;::::0;;;;:20;;-1:-1:-1;;42710:20:0::1;42726:4;42710:20;::::0;;42649:89::o;37998:103::-;37420:6;;-1:-1:-1;;;;;37420:6:0;17670:10;37567:23;37559:68;;;;-1:-1:-1;;;37559:68:0;;;;;;;:::i;:::-;38063:30:::1;38090:1;38063:18;:30::i;44058:172::-:0;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;44154:1:::1;44144:7;:11;44136:54;;;::::0;-1:-1:-1;;;44136:54:0;;17219:2:1;44136:54:0::1;::::0;::::1;17201:21:1::0;17258:2;17238:18;;;17231:30;17297:33;17277:18;;;17270:61;17348:18;;44136:54:0::1;17017:355:1::0;44136:54:0::1;44201:14;::::0;;;:5:::1;:14;::::0;;;;;:21;44058:172::o;43415:119::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;43498:14:::1;:28:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;43498:28:0;;;;;::::1;::::0;43415:119::o;47345:74::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;47396:7:::1;:15:::0;;-1:-1:-1;;47396:15:0::1;::::0;;47345:74::o;41793:28::-;;;;;;;:::i;43542:113::-;42286:10;42279:18;;;;:6;:18;;;;;;43597:16;;42279:18;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;43633:14:::1;43626:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42373:1;43542:113:::0;:::o;42847:98::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;42919:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42847:98:::0;:::o;21898:155::-;21993:52;17670:10;22026:8;22036;21993:18;:52::i;45096:122::-;45166:7;45193:8;45202:7;45208:1;45202:3;:7;:::i;:::-;45193:17;;;;;;;;:::i;:::-;;;;;;;;;45186:24;;45096:122;;;:::o;43663:387::-;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;43776:1:::1;43766:7;:11;43758:54;;;::::0;-1:-1:-1;;;43758:54:0;;17219:2:1;43758:54:0::1;::::0;::::1;17201:21:1::0;17258:2;17238:18;;;17231:30;17297:33;17277:18;;;17270:61;17348:18;;43758:54:0::1;17017:355:1::0;43758:54:0::1;43837:8;:15:::0;43827:25;::::1;43823:139;;;43868:8;:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;43868:21:0;;;;;::::1;::::0;;;43823:139:::1;;;43944:6:::0;43920:8:::1;43929:11;43939:1;43929:7:::0;:11:::1;:::i;:::-;43920:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;43823:139:::1;43978:6;43974:69;;;44000:31;44021:7;44029:1;44000:20;:31::i;42953:81::-:0;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;43005:21:::1;43012:14;;43005:21;:::i;46100:839::-:0;46218:14;:21;46130:7;;46210:52;;;;-1:-1:-1;;;46210:52:0;;17579:2:1;46210:52:0;;;17561:21:1;17618:2;17598:18;;;17591:30;-1:-1:-1;;;17637:18:1;;;17630:45;17692:18;;46210:52:0;17377:339:1;46210:52:0;46312:14;:21;46273:19;;46295:14;45871:159;;-1:-1:-1;;45910:10:0;22132:2:1;22128:15;;;22124:24;;45871:159:0;;;22112:37:1;45928:14:0;22183:15:1;;22179:24;22165:12;;;22158:46;45950:16:0;22220:12:1;;;22213:28;45974:14:0;22257:12:1;;;22250:28;45996:15:0;22294:13:1;;;22287:29;45785:7:0;;;;22332:13:1;;45871:159:0;;;-1:-1:-1;;45871:159:0;;;;;;;;;45847:198;;45871:159;45847:198;;;;;45739:353;-1:-1:-1;;45739:353:0;46295:14;:38;;;;:::i;:::-;46273:60;;46427:20;46450:14;46465:11;46450:27;;;;;;;;:::i;:::-;;;;;;;;;46427:50;;46712:14;46751:1;46727:14;:21;;;;:25;;;;:::i;:::-;46712:41;;;;;;;;:::i;:::-;;;;;;;;;46682:14;46697:11;46682:27;;;;;;;;:::i;:::-;;;;;;;;;;:71;46879:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46919:12;46912:19;;;;46100:839;:::o;22365:401::-;-1:-1:-1;;;;;22573:20:0;;17670:10;22573:20;;:60;;-1:-1:-1;22597:36:0;22614:4;17670:10;22125:168;:::i;22597:36::-;22551:151;;;;-1:-1:-1;;;22551:151:0;;18304:2:1;22551:151:0;;;18286:21:1;18343:2;18323:18;;;18316:30;18382:34;18362:18;;;18355:62;-1:-1:-1;;;18433:18:1;;;18426:39;18482:19;;22551:151:0;18102:405:1;22551:151:0;22713:45;22731:4;22737:2;22741;22745:6;22753:4;22713:17;:45::i;38256:201::-;37420:6;;-1:-1:-1;;;;;37420:6:0;17670:10;37567:23;37559:68;;;;-1:-1:-1;;;37559:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38345:22:0;::::1;38337:73;;;::::0;-1:-1:-1;;;38337:73:0;;18714:2:1;38337:73:0::1;::::0;::::1;18696:21:1::0;18753:2;18733:18;;;18726:30;18792:34;18772:18;;;18765:62;-1:-1:-1;;;18843:18:1;;;18836:36;18889:19;;38337:73:0::1;18512:402:1::0;38337:73:0::1;38421:28;38440:8;38421:18;:28::i;43042:365::-:0;42286:10;42279:18;;;;:6;:18;;;;;;;;;:43;;-1:-1:-1;37420:6:0;;-1:-1:-1;;;;;37420:6:0;42301:10;:21;42279:43;42271:91;;;;-1:-1:-1;;;42271:91:0;;;;;;;:::i;:::-;43139:15:::1;43157:21:::0;;:64:::1;;43205:16;43157:64;;;43181:8;43190:11;43200:1;43190:7:::0;:11:::1;:::i;:::-;43181:21;;;;;;;;:::i;:::-;;;;;;;;;43157:64;43139:82;;43232:9;43296:7;43274:19;;:29;;;;:::i;:::-;43252:19;:51:::0;-1:-1:-1;43323:1:0::1;43314:86;43330:7;43326:1;:11;43314:86;;;43360:14;:28:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;43360:28:0;;;;;::::1;::::0;;;43338:6:::1;::::0;;::::1;:::i;:::-;;;43314:86;;;43128:279;;43042:365:::0;;:::o;39183:723::-;39239:13;39460:10;39456:53;;-1:-1:-1;;39487:10:0;;;;;;;;;;;;-1:-1:-1;;;39487:10:0;;;;;39183:723::o;39456:53::-;39534:5;39519:12;39575:78;39582:9;;39575:78;;39608:8;;;;:::i;:::-;;-1:-1:-1;39631:10:0;;-1:-1:-1;39639:2:0;39631:10;;:::i;:::-;;;39575:78;;;39663:19;39695:6;39685:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39685:17:0;;39663:39;;39713:154;39720:10;;39713:154;;39747:11;39757:1;39747:11;;:::i;:::-;;-1:-1:-1;39816:10:0;39824:2;39816:5;:10;:::i;:::-;39803:24;;:2;:24;:::i;:::-;39790:39;;39773:6;39780;39773:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;39773:56:0;;;;;;;;-1:-1:-1;39844:11:0;39853:2;39844:11;;:::i;:::-;;;39713:154;;;39891:6;39183:723;-1:-1:-1;;;;39183:723:0:o;27545:729::-;-1:-1:-1;;;;;27698:16:0;;27690:62;;;;-1:-1:-1;;;27690:62:0;;19246:2:1;27690:62:0;;;19228:21:1;19285:2;19265:18;;;19258:30;19324:34;19304:18;;;19297:62;-1:-1:-1;;;19375:18:1;;;19368:31;19416:19;;27690:62:0;19044:397:1;27690:62:0;17670:10;27765:16;27830:21;27848:2;27830:17;:21::i;:::-;27807:44;;27862:24;27889:25;27907:6;27889:17;:25::i;:::-;27862:52;;28006:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28006:17:0;;;;;;;;;:27;;28027:6;;28006:9;:27;;28027:6;;28006:27;:::i;:::-;;;;-1:-1:-1;;28049:52:0;;;19620:25:1;;;19676:2;19661:18;;19654:34;;;-1:-1:-1;;;;;28049:52:0;;;;28082:1;;28049:52;;;;;;19593:18:1;28049:52:0;;;;;;;28192:74;28223:8;28241:1;28245:2;28249;28253:6;28261:4;28192:30;:74::i;:::-;27679:595;;;27545:729;;;;:::o;25081:1146::-;25308:7;:14;25294:3;:10;:28;25286:81;;;;-1:-1:-1;;;25286:81:0;;19901:2:1;25286:81:0;;;19883:21:1;19940:2;19920:18;;;19913:30;19979:34;19959:18;;;19952:62;-1:-1:-1;;;20030:18:1;;;20023:38;20078:19;;25286:81:0;19699:404:1;25286:81:0;-1:-1:-1;;;;;25386:16:0;;25378:66;;;;-1:-1:-1;;;25378:66:0;;;;;;;:::i;:::-;17670:10;25457:16;25574:421;25598:3;:10;25594:1;:14;25574:421;;;25630:10;25643:3;25647:1;25643:6;;;;;;;;:::i;:::-;;;;;;;25630:19;;25664:14;25681:7;25689:1;25681:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25708:19;25730:13;;;;;;;;;;-1:-1:-1;;;;;25730:19:0;;;;;;;;;;;;25681:10;;-1:-1:-1;25772:21:0;;;;25764:76;;;;-1:-1:-1;;;25764:76:0;;;;;;;:::i;:::-;25884:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25884:19:0;;;;;;;;;;25906:20;;;25884:42;;25956:17;;;;;;;:27;;25906:20;;25884:9;25956:27;;25906:20;;25956:27;:::i;:::-;;;;;;;;25615:380;;;25610:3;;;;:::i;:::-;;;25574:421;;;;26042:2;-1:-1:-1;;;;;26012:47:0;26036:4;-1:-1:-1;;;;;26012:47:0;26026:8;-1:-1:-1;;;;;26012:47:0;;26046:3;26051:7;26012:47;;;;;;;:::i;:::-;;;;;;;;26144:75;26180:8;26190:4;26196:2;26200:3;26205:7;26214:4;26144:35;:75::i;:::-;25275:952;25081:1146;;;;;:::o;38617:191::-;38710:6;;;-1:-1:-1;;;;;38727:17:0;;;-1:-1:-1;;;;;;38727:17:0;;;;;;;38760:40;;38710:6;;;38727:17;38710:6;;38760:40;;38691:16;;38760:40;38680:128;38617:191;:::o;31815:331::-;31970:8;-1:-1:-1;;;;;31961:17:0;:5;-1:-1:-1;;;;;31961:17:0;;;31953:71;;;;-1:-1:-1;;;31953:71:0;;21597:2:1;31953:71:0;;;21579:21:1;21636:2;21616:18;;;21609:30;21675:34;21655:18;;;21648:62;-1:-1:-1;;;21726:18:1;;;21719:39;21775:19;;31953:71:0;21395:405:1;31953:71:0;-1:-1:-1;;;;;32035:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32035:46:0;;;;;;;;;;32097:41;;1159::1;;;32097::0;;1132:18:1;32097:41:0;;;;;;;31815:331;;;:::o;23749:974::-;-1:-1:-1;;;;;23937:16:0;;23929:66;;;;-1:-1:-1;;;23929:66:0;;;;;;;:::i;:::-;17670:10;24008:16;24073:21;24091:2;24073:17;:21::i;:::-;24050:44;;24105:24;24132:25;24150:6;24132:17;:25::i;:::-;24105:52;;24243:19;24265:13;;;;;;;;;;;-1:-1:-1;;;;;24265:19:0;;;;;;;;;;24303:21;;;;24295:76;;;;-1:-1:-1;;;24295:76:0;;;;;;;:::i;:::-;24407:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24407:19:0;;;;;;;;;;24429:20;;;24407:42;;24471:17;;;;;;;:27;;24429:20;;24407:9;24471:27;;24429:20;;24471:27;:::i;:::-;;;;-1:-1:-1;;24516:46:0;;;19620:25:1;;;19676:2;19661:18;;19654:34;;;-1:-1:-1;;;;;24516:46:0;;;;;;;;;;;;;;19593:18:1;24516:46:0;;;;;;;24647:68;24678:8;24688:4;24694:2;24698;24702:6;24710:4;24647:30;:68::i;:::-;23918:805;;;;23749:974;;;;;:::o;36079:198::-;36199:16;;;36213:1;36199:16;;;;;;;;;36145;;36174:22;;36199:16;;;;;;;;;;;;-1:-1:-1;36199:16:0;36174:41;;36237:7;36226:5;36232:1;36226:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36264:5;36079:198;-1:-1:-1;;36079:198:0:o;34506:744::-;-1:-1:-1;;;;;34721:13:0;;9933:19;:23;34717:526;;34757:72;;-1:-1:-1;;;34757:72:0;;-1:-1:-1;;;;;34757:38:0;;;;;:72;;34796:8;;34806:4;;34812:2;;34816:6;;34824:4;;34757:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34757:72:0;;;;;;;;-1:-1:-1;;34757:72:0;;;;;;;;;;;;:::i;:::-;;;34753:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35105:6;35098:14;;-1:-1:-1;;;35098:14:0;;;;;;;;:::i;34753:479::-;;;35154:62;;-1:-1:-1;;;35154:62:0;;24249:2:1;35154:62:0;;;24231:21:1;24288:2;24268:18;;;24261:30;24327:34;24307:18;;;24300:62;-1:-1:-1;;;24378:18:1;;;24371:50;24438:19;;35154:62:0;24047:416:1;34753:479:0;-1:-1:-1;;;;;;34879:55:0;;-1:-1:-1;;;34879:55:0;34875:154;;34959:50;;-1:-1:-1;;;34959:50:0;;;;;;;:::i;35258:813::-;-1:-1:-1;;;;;35498:13:0;;9933:19;:23;35494:570;;35534:79;;-1:-1:-1;;;35534:79:0;;-1:-1:-1;;;;;35534:43:0;;;;;:79;;35578:8;;35588:4;;35594:3;;35599:7;;35608:4;;35534:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35534:79:0;;;;;;;;-1:-1:-1;;35534:79:0;;;;;;;;;;;;:::i;:::-;;;35530:523;;;;:::i;:::-;-1:-1:-1;;;;;;35695:60:0;;-1:-1:-1;;;35695:60:0;35691:159;;35780:50;;-1:-1:-1;;;35780:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:254;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:258::-;1283:1;1293:113;1307:6;1304:1;1301:13;1293:113;;;1383:11;;;1377:18;1364:11;;;1357:39;1329:2;1322:10;1293:113;;;1424:6;1421:1;1418:13;1415:48;;;-1:-1:-1;;1459:1:1;1441:16;;1434:27;1211:258::o;1474:269::-;1527:3;1565:5;1559:12;1592:6;1587:3;1580:19;1608:63;1664:6;1657:4;1652:3;1648:14;1641:4;1634:5;1630:16;1608:63;:::i;:::-;1725:2;1704:15;-1:-1:-1;;1700:29:1;1691:39;;;;1732:4;1687:50;;1474:269;-1:-1:-1;;1474:269:1:o;1748:231::-;1897:2;1886:9;1879:21;1860:4;1917:56;1969:2;1958:9;1954:18;1946:6;1917:56;:::i;1984:180::-;2043:6;2096:2;2084:9;2075:7;2071:23;2067:32;2064:52;;;2112:1;2109;2102:12;2064:52;-1:-1:-1;2135:23:1;;1984:180;-1:-1:-1;1984:180:1:o;2169:186::-;2228:6;2281:2;2269:9;2260:7;2256:23;2252:32;2249:52;;;2297:1;2294;2287:12;2249:52;2320:29;2339:9;2320:29;:::i;2360:127::-;2421:10;2416:3;2412:20;2409:1;2402:31;2452:4;2449:1;2442:15;2476:4;2473:1;2466:15;2492:249;2602:2;2583:13;;-1:-1:-1;;2579:27:1;2567:40;;2637:18;2622:34;;2658:22;;;2619:62;2616:88;;;2684:18;;:::i;:::-;2720:2;2713:22;-1:-1:-1;;2492:249:1:o;2746:183::-;2806:4;2839:18;2831:6;2828:30;2825:56;;;2861:18;;:::i;:::-;-1:-1:-1;2906:1:1;2902:14;2918:4;2898:25;;2746:183::o;2934:724::-;2988:5;3041:3;3034:4;3026:6;3022:17;3018:27;3008:55;;3059:1;3056;3049:12;3008:55;3095:6;3082:20;3121:4;3144:43;3184:2;3144:43;:::i;:::-;3216:2;3210:9;3228:31;3256:2;3248:6;3228:31;:::i;:::-;3294:18;;;3386:1;3382:10;;;;3370:23;;3366:32;;;3328:15;;;;-1:-1:-1;3410:15:1;;;3407:35;;;3438:1;3435;3428:12;3407:35;3474:2;3466:6;3462:15;3486:142;3502:6;3497:3;3494:15;3486:142;;;3568:17;;3556:30;;3606:12;;;;3519;;3486:142;;;-1:-1:-1;3646:6:1;2934:724;-1:-1:-1;;;;;;2934:724:1:o;3663:468::-;3727:5;3761:18;3753:6;3750:30;3747:56;;;3783:18;;:::i;:::-;3832:2;3826:9;3844:69;3901:2;3880:15;;-1:-1:-1;;3876:29:1;3907:4;3872:40;3826:9;3844:69;:::i;:::-;3931:6;3922:15;;3961:6;3953;3946:22;4001:3;3992:6;3987:3;3983:16;3980:25;3977:45;;;4018:1;4015;4008:12;3977:45;4068:6;4063:3;4056:4;4048:6;4044:17;4031:44;4123:1;4116:4;4107:6;4099;4095:19;4091:30;4084:41;;3663:468;;;;;:::o;4136:220::-;4178:5;4231:3;4224:4;4216:6;4212:17;4208:27;4198:55;;4249:1;4246;4239:12;4198:55;4271:79;4346:3;4337:6;4324:20;4317:4;4309:6;4305:17;4271:79;:::i;4361:943::-;4515:6;4523;4531;4539;4547;4600:3;4588:9;4579:7;4575:23;4571:33;4568:53;;;4617:1;4614;4607:12;4568:53;4640:29;4659:9;4640:29;:::i;:::-;4630:39;;4688:38;4722:2;4711:9;4707:18;4688:38;:::i;:::-;4678:48;;4777:2;4766:9;4762:18;4749:32;4800:18;4841:2;4833:6;4830:14;4827:34;;;4857:1;4854;4847:12;4827:34;4880:61;4933:7;4924:6;4913:9;4909:22;4880:61;:::i;:::-;4870:71;;4994:2;4983:9;4979:18;4966:32;4950:48;;5023:2;5013:8;5010:16;5007:36;;;5039:1;5036;5029:12;5007:36;5062:63;5117:7;5106:8;5095:9;5091:24;5062:63;:::i;:::-;5052:73;;5178:3;5167:9;5163:19;5150:33;5134:49;;5208:2;5198:8;5195:16;5192:36;;;5224:1;5221;5214:12;5192:36;;5247:51;5290:7;5279:8;5268:9;5264:24;5247:51;:::i;:::-;5237:61;;;4361:943;;;;;;;;:::o;5309:1208::-;5427:6;5435;5488:2;5476:9;5467:7;5463:23;5459:32;5456:52;;;5504:1;5501;5494:12;5456:52;5544:9;5531:23;5573:18;5614:2;5606:6;5603:14;5600:34;;;5630:1;5627;5620:12;5600:34;5668:6;5657:9;5653:22;5643:32;;5713:7;5706:4;5702:2;5698:13;5694:27;5684:55;;5735:1;5732;5725:12;5684:55;5771:2;5758:16;5793:4;5816:43;5856:2;5816:43;:::i;:::-;5888:2;5882:9;5900:31;5928:2;5920:6;5900:31;:::i;:::-;5966:18;;;6054:1;6050:10;;;;6042:19;;6038:28;;;6000:15;;;;-1:-1:-1;6078:19:1;;;6075:39;;;6110:1;6107;6100:12;6075:39;6134:11;;;;6154:148;6170:6;6165:3;6162:15;6154:148;;;6236:23;6255:3;6236:23;:::i;:::-;6224:36;;6187:12;;;;6280;;;;6154:148;;;6321:6;-1:-1:-1;;6365:18:1;;6352:32;;-1:-1:-1;;6396:16:1;;;6393:36;;;6425:1;6422;6415:12;6393:36;;6448:63;6503:7;6492:8;6481:9;6477:24;6448:63;:::i;:::-;6438:73;;;5309:1208;;;;;:::o;6522:435::-;6575:3;6613:5;6607:12;6640:6;6635:3;6628:19;6666:4;6695:2;6690:3;6686:12;6679:19;;6732:2;6725:5;6721:14;6753:1;6763:169;6777:6;6774:1;6771:13;6763:169;;;6838:13;;6826:26;;6872:12;;;;6907:15;;;;6799:1;6792:9;6763:169;;;-1:-1:-1;6948:3:1;;6522:435;-1:-1:-1;;;;;6522:435:1:o;6962:261::-;7141:2;7130:9;7123:21;7104:4;7161:56;7213:2;7202:9;7198:18;7190:6;7161:56;:::i;7228:248::-;7296:6;7304;7357:2;7345:9;7336:7;7332:23;7328:32;7325:52;;;7373:1;7370;7363:12;7325:52;-1:-1:-1;;7396:23:1;;;7466:2;7451:18;;;7438:32;;-1:-1:-1;7228:248:1:o;7689:450::-;7758:6;7811:2;7799:9;7790:7;7786:23;7782:32;7779:52;;;7827:1;7824;7817:12;7779:52;7867:9;7854:23;7900:18;7892:6;7889:30;7886:50;;;7932:1;7929;7922:12;7886:50;7955:22;;8008:4;8000:13;;7996:27;-1:-1:-1;7986:55:1;;8037:1;8034;8027:12;7986:55;8060:73;8125:7;8120:2;8107:16;8102:2;8098;8094:11;8060:73;:::i;8144:160::-;8209:20;;8265:13;;8258:21;8248:32;;8238:60;;8294:1;8291;8284:12;8309:254;8374:6;8382;8435:2;8423:9;8414:7;8410:23;8406:32;8403:52;;;8451:1;8448;8441:12;8403:52;8474:29;8493:9;8474:29;:::i;:::-;8464:39;;8522:35;8553:2;8542:9;8538:18;8522:35;:::i;:::-;8512:45;;8309:254;;;;;:::o;8568:316::-;8642:6;8650;8658;8711:2;8699:9;8690:7;8686:23;8682:32;8679:52;;;8727:1;8724;8717:12;8679:52;8763:9;8750:23;8740:33;;8820:2;8809:9;8805:18;8792:32;8782:42;;8843:35;8874:2;8863:9;8859:18;8843:35;:::i;:::-;8833:45;;8568:316;;;;;:::o;8889:260::-;8957:6;8965;9018:2;9006:9;8997:7;8993:23;8989:32;8986:52;;;9034:1;9031;9024:12;8986:52;9057:29;9076:9;9057:29;:::i;:::-;9047:39;;9105:38;9139:2;9128:9;9124:18;9105:38;:::i;9154:606::-;9258:6;9266;9274;9282;9290;9343:3;9331:9;9322:7;9318:23;9314:33;9311:53;;;9360:1;9357;9350:12;9311:53;9383:29;9402:9;9383:29;:::i;:::-;9373:39;;9431:38;9465:2;9454:9;9450:18;9431:38;:::i;:::-;9421:48;;9516:2;9505:9;9501:18;9488:32;9478:42;;9567:2;9556:9;9552:18;9539:32;9529:42;;9622:3;9611:9;9607:19;9594:33;9650:18;9642:6;9639:30;9636:50;;;9682:1;9679;9672:12;9636:50;9705:49;9746:7;9737:6;9726:9;9722:22;9705:49;:::i;10177:380::-;10256:1;10252:12;;;;10299;;;10320:61;;10374:4;10366:6;10362:17;10352:27;;10320:61;10427:2;10419:6;10416:14;10396:18;10393:38;10390:161;;;10473:10;10468:3;10464:20;10461:1;10454:31;10508:4;10505:1;10498:15;10536:4;10533:1;10526:15;10390:161;;10177:380;;;:::o;10688:185::-;10730:3;10768:5;10762:12;10783:52;10828:6;10823:3;10816:4;10809:5;10805:16;10783:52;:::i;:::-;10851:16;;;;;10688:185;-1:-1:-1;;10688:185:1:o;10996:1301::-;11273:3;11302:1;11335:6;11329:13;11365:3;11387:1;11415:9;11411:2;11407:18;11397:28;;11475:2;11464:9;11460:18;11497;11487:61;;11541:4;11533:6;11529:17;11519:27;;11487:61;11567:2;11615;11607:6;11604:14;11584:18;11581:38;11578:165;;;-1:-1:-1;;;11642:33:1;;11698:4;11695:1;11688:15;11728:4;11649:3;11716:17;11578:165;11759:18;11786:104;;;;11904:1;11899:320;;;;11752:467;;11786:104;-1:-1:-1;;11819:24:1;;11807:37;;11864:16;;;;-1:-1:-1;11786:104:1;;11899:320;10635:1;10628:14;;;10672:4;10659:18;;11994:1;12008:165;12022:6;12019:1;12016:13;12008:165;;;12100:14;;12087:11;;;12080:35;12143:16;;;;12037:10;;12008:165;;;12012:3;;12202:6;12197:3;12193:16;12186:23;;11752:467;;;;;;;12235:56;12260:30;12286:3;12278:6;12260:30;:::i;:::-;-1:-1:-1;;;10938:20:1;;10983:1;10974:11;;10878:113;12235:56;12228:63;10996:1301;-1:-1:-1;;;;;10996:1301:1:o;12302:127::-;12363:10;12358:3;12354:20;12351:1;12344:31;12394:4;12391:1;12384:15;12418:4;12415:1;12408:15;12434:125;12474:4;12502:1;12499;12496:8;12493:34;;;12507:18;;:::i;:::-;-1:-1:-1;12544:9:1;;12434:125::o;13614:127::-;13675:10;13670:3;13666:20;13663:1;13656:31;13706:4;13703:1;13696:15;13730:4;13727:1;13720:15;14788:128;14828:3;14859:1;14855:6;14852:1;14849:13;14846:39;;;14865:18;;:::i;:::-;-1:-1:-1;14901:9:1;;14788:128::o;14921:400::-;15123:2;15105:21;;;15162:2;15142:18;;;15135:30;15201:34;15196:2;15181:18;;15174:62;-1:-1:-1;;;15267:2:1;15252:18;;15245:34;15311:3;15296:19;;14921:400::o;15745:356::-;15947:2;15929:21;;;15966:18;;;15959:30;16025:34;16020:2;16005:18;;15998:62;16092:2;16077:18;;15745:356::o;16877:135::-;16916:3;-1:-1:-1;;16937:17:1;;16934:43;;;16957:18;;:::i;:::-;-1:-1:-1;17004:1:1;16993:13;;16877:135::o;17721:127::-;17782:10;17777:3;17773:20;17770:1;17763:31;17813:4;17810:1;17803:15;17837:4;17834:1;17827:15;17853:112;17885:1;17911;17901:35;;17916:18;;:::i;:::-;-1:-1:-1;17950:9:1;;17853:112::o;17970:127::-;18031:10;18026:3;18022:20;18019:1;18012:31;18062:4;18059:1;18052:15;18086:4;18083:1;18076:15;18919:120;18959:1;18985;18975:35;;18990:18;;:::i;:::-;-1:-1:-1;19024:9:1;;18919:120::o;20108:401::-;20310:2;20292:21;;;20349:2;20329:18;;;20322:30;20388:34;20383:2;20368:18;;20361:62;-1:-1:-1;;;20454:2:1;20439:18;;20432:35;20499:3;20484:19;;20108:401::o;20514:406::-;20716:2;20698:21;;;20755:2;20735:18;;;20728:30;20794:34;20789:2;20774:18;;20767:62;-1:-1:-1;;;20860:2:1;20845:18;;20838:40;20910:3;20895:19;;20514:406::o;20925:465::-;21182:2;21171:9;21164:21;21145:4;21208:56;21260:2;21249:9;21245:18;21237:6;21208:56;:::i;:::-;21312:9;21304:6;21300:22;21295:2;21284:9;21280:18;21273:50;21340:44;21377:6;21369;21340:44;:::i;22356:572::-;-1:-1:-1;;;;;22653:15:1;;;22635:34;;22705:15;;22700:2;22685:18;;22678:43;22752:2;22737:18;;22730:34;;;22795:2;22780:18;;22773:34;;;22615:3;22838;22823:19;;22816:32;;;22578:4;;22865:57;;22902:19;;22894:6;22865:57;:::i;:::-;22857:65;22356:572;-1:-1:-1;;;;;;;22356:572:1:o;22933:249::-;23002:6;23055:2;23043:9;23034:7;23030:23;23026:32;23023:52;;;23071:1;23068;23061:12;23023:52;23103:9;23097:16;23122:30;23146:5;23122:30;:::i;23187:179::-;23222:3;23264:1;23246:16;23243:23;23240:120;;;23310:1;23307;23304;23289:23;-1:-1:-1;23347:1:1;23341:8;23336:3;23332:18;23187:179;:::o;23371:671::-;23410:3;23452:4;23434:16;23431:26;23428:39;;;23371:671;:::o;23428:39::-;23494:2;23488:9;-1:-1:-1;;23559:16:1;23555:25;;23552:1;23488:9;23531:50;23610:4;23604:11;23634:16;23669:18;23740:2;23733:4;23725:6;23721:17;23718:25;23713:2;23705:6;23702:14;23699:45;23696:58;;;23747:5;;;;;23371:671;:::o;23696:58::-;23784:6;23778:4;23774:17;23763:28;;23820:3;23814:10;23847:2;23839:6;23836:14;23833:27;;;23853:5;;;;;;23371:671;:::o;23833:27::-;23937:2;23918:16;23912:4;23908:27;23904:36;23897:4;23888:6;23883:3;23879:16;23875:27;23872:69;23869:82;;;23944:5;;;;;;23371:671;:::o;23869:82::-;23960:57;24011:4;24002:6;23994;23990:19;23986:30;23980:4;23960:57;:::i;:::-;-1:-1:-1;24033:3:1;;23371:671;-1:-1:-1;;;;;23371:671:1:o;24468:404::-;24670:2;24652:21;;;24709:2;24689:18;;;24682:30;24748:34;24743:2;24728:18;;24721:62;-1:-1:-1;;;24814:2:1;24799:18;;24792:38;24862:3;24847:19;;24468:404::o;24877:838::-;-1:-1:-1;;;;;25274:15:1;;;25256:34;;25326:15;;25321:2;25306:18;;25299:43;25236:3;25373:2;25358:18;;25351:31;;;25199:4;;25405:57;;25442:19;;25434:6;25405:57;:::i;:::-;25510:9;25502:6;25498:22;25493:2;25482:9;25478:18;25471:50;25544:44;25581:6;25573;25544:44;:::i;:::-;25530:58;;25637:9;25629:6;25625:22;25619:3;25608:9;25604:19;25597:51;25665:44;25702:6;25694;25665:44;:::i;:::-;25657:52;24877:838;-1:-1:-1;;;;;;;;24877:838:1:o
Swarm Source
ipfs://e8486fca8003546437e2aca177960a557e611cc73dadb1f93c92125f41dd6204
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.