Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
75 FORMLESS
Holders
36
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:
NFT1155
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-06 */ // SPDX-License-Identifier: MIT // Amended by FullStackHustle /** $$$$$$$$\ $$\ $$\ $$$$$$\ $$\ $$\ $$\ $$\ $$\ $$\ $$ _____| $$ |$$ |$$ __$$\ $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$\ $$\ $$ |$$ |$$ / \__|$$$$$$\ $$$$$$\ $$$$$$$\ $$ | $$\ $$ | $$ |$$\ $$\ $$$$$$$\ $$$$$$\ $$ | $$$$$$\ $$$$$\ $$ | $$ |$$ |$$ |\$$$$$$\ \_$$ _| \____$$\ $$ _____|$$ | $$ |$$$$$$$$ |$$ | $$ |$$ _____|\_$$ _| $$ |$$ __$$\ $$ __|$$ | $$ |$$ |$$ | \____$$\ $$ | $$$$$$$ |$$ / $$$$$$ / $$ __$$ |$$ | $$ |\$$$$$$\ $$ | $$ |$$$$$$$$ | $$ | $$ | $$ |$$ |$$ |$$\ $$ | $$ |$$\ $$ __$$ |$$ | $$ _$$< $$ | $$ |$$ | $$ | \____$$\ $$ |$$\ $$ |$$ ____| $$ | \$$$$$$ |$$ |$$ |\$$$$$$ | \$$$$ |\$$$$$$$ |\$$$$$$$\ $$ | \$$\ $$ | $$ |\$$$$$$ |$$$$$$$ | \$$$$ |$$ |\$$$$$$$\ \__| \______/ \__|\__| \______/ \____/ \_______| \_______|\__| \__|\__| \__| \______/ \_______/ \____/ \__| \_______| */ // File: default_workspace/contracts/rarible/royalties/contracts/LibPart.sol pragma solidity ^0.8.0; library LibPart { bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)"); struct Part { address payable account; uint96 value; } function hash(Part memory part) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, part.account, part.value)); } } // File: default_workspace/contracts/rarible/royalties/contracts/LibRoyalties2981.sol pragma solidity ^0.8.0; library LibRoyalties2981 { /* * https://eips.ethereum.org/EIPS/eip-2981: bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; */ bytes4 constant _INTERFACE_ID_ROYALTIES = 0x2a55205a; uint96 constant _WEIGHT_VALUE = 1000000; /*Method for converting amount to percent and forming LibPart*/ function calculateRoyalties(address to, uint256 amount) internal view returns (LibPart.Part[] memory) { LibPart.Part[] memory result; if (amount == 0) { return result; } uint256 percent = (amount * 100 / _WEIGHT_VALUE) * 100; require(percent < 10000, "Royalties 2981, than 100%"); result = new LibPart.Part[](1); result[0].account = payable(to); result[0].value = uint96(percent); return result; } } // File: default_workspace/contracts/rarible/royalties/contracts/IERC2981.sol pragma solidity ^0.8.0; /// /// @dev Interface for the NFT Royalty Standard /// //interface IERC2981 is IERC165 { interface IERC2981 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); } // File: default_workspace/contracts/rarible/royalties/contracts/RoyaltiesV2.sol pragma solidity ^0.8.0; pragma abicoder v2; interface RoyaltiesV2 { event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties); function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory); } // File: default_workspace/contracts/rarible/royalties/contracts/impl/AbstractRoyalties.sol pragma solidity ^0.8.0; abstract contract AbstractRoyalties { mapping (uint256 => LibPart.Part[]) internal royalties; function _saveRoyalties(uint256 id, LibPart.Part[] memory _royalties) internal { uint256 totalValue; for (uint i = 0; i < _royalties.length; i++) { require(_royalties[i].account != address(0x0), "Recipient should be present"); require(_royalties[i].value != 0, "Royalty value should be positive"); totalValue += _royalties[i].value; royalties[id].push(_royalties[i]); } require(totalValue < 10000, "Royalty total value should be < 10000"); _onRoyaltiesSet(id, _royalties); } function _updateAccount(uint256 _id, address _from, address _to) internal { uint length = royalties[_id].length; for(uint i = 0; i < length; i++) { if (royalties[_id][i].account == _from) { royalties[_id][i].account = payable(address(uint160(_to))); } } } function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) virtual internal; } // File: default_workspace/contracts/rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol pragma solidity ^0.8.0; contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2, IERC2981 { function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) { return royalties[id]; } function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) override internal { emit RoyaltiesSet(id, _royalties); } /* *Token (ERC721, ERC721Minimal, ERC721MinimalMeta, ERC1155 ) can have a number of different royalties beneficiaries *calculate sum all royalties, but royalties beneficiary will be only one royalties[0].account, according to rules of IERC2981 */ function royaltyInfo(uint256 id, uint256 _salePrice) virtual override external view returns (address receiver, uint256 royaltyAmount) { if (royalties[id].length == 0) { receiver = address(0); royaltyAmount = 0; return(receiver, royaltyAmount); } LibPart.Part[] memory _royalties = royalties[id]; receiver = _royalties[0].account; uint percent; for (uint i = 0; i < _royalties.length; i++) { percent += _royalties[i].value; } //don`t need require(percent < 10000, "Token royalty > 100%"); here, because check later in calculateRoyalties royaltyAmount = percent * _salePrice / 10000; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: address zero is not a valid owner"); 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}. * * 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 _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` * * Emits a {TransferSingle} event. * * 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}. * * Emits a {TransferBatch} event. * * 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 `ids` and `amounts` 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: default_workspace/contracts/formless.sol pragma solidity ^0.8.0; contract NFT1155 is ERC1155, RoyaltiesV2Impl, Ownable { string public name; string public symbol; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; mapping(uint => string) public tokenURI; constructor() ERC1155("") { name = "Formless by RAREBANDY"; symbol = "FORMLESS"; } function mint(address _to, uint _id, uint _amount) external onlyOwner { _mint(_to, _id, _amount, ""); } function mintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) external onlyOwner { _mintBatch(_to, _ids, _amounts, ""); } function setURI(uint _id, string memory _uri) external onlyOwner { tokenURI[_id] = _uri; emit URI(_uri, _id); } function uri(uint _id) public override view returns (string memory) { return tokenURI[_id]; } function setRoyalties(uint _id, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public onlyOwner { LibPart.Part[] memory _royalties = new LibPart.Part[](1); _royalties[0].value = _percentageBasisPoints; _royalties[0].account = _royaltiesReceipientAddress; _saveRoyalties(_id, _royalties); } function royaltyInfo(uint256 _id, uint256 _salePrice) virtual override external view returns (address receiver, uint256 royaltyAmount) { LibPart.Part[] memory _royalties = royalties[_id]; if(_royalties.length > 0) { return (_royalties[0].account, (_salePrice * _royalties[0].value)/10000); } return (address(0), 0); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) { if(interfaceId == LibRoyalties2981._INTERFACE_ID_ROYALTIES) { return true; } if(interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } }
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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","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":"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":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"uint256","name":"_id","type":"uint256"},{"internalType":"address payable","name":"_royaltiesReceipientAddress","type":"address"},{"internalType":"uint96","name":"_percentageBasisPoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","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":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040805160208101909152600081526200002c81620000b7565b506200003833620000d0565b6040805180820190915260158082527f466f726d6c657373206279205241524542414e4459000000000000000000000060209092019182526200007e9160059162000122565b5060408051808201909152600880825267464f524d4c45535360c01b6020909201918252620000b09160069162000122565b5062000205565b8051620000cc90600290602084019062000122565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013090620001c8565b90600052602060002090601f0160209004810192826200015457600085556200019f565b82601f106200016f57805160ff19168380011785556200019f565b828001600101855582156200019f579182015b828111156200019f57825182559160200191906001019062000182565b50620001ad929150620001b1565b5090565b5b80821115620001ad5760008155600101620001b2565b600181811c90821680620001dd57607f821691505b60208210811415620001ff57634e487b7160e01b600052602260045260246000fd5b50919050565b61232d80620002156000396000f3fe608060405234801561001057600080fd5b506004361061012b5760003560e01c8063862440e2116100ad578063cad96cca11610071578063cad96cca14610292578063d81d0a15146102b2578063e985e9c5146102c5578063f242432a14610301578063f2fde38b1461031457600080fd5b8063862440e2146102365780638da5cb5b1461024957806395d89b4114610264578063a22cb4651461026c578063c87b56dd1461027f57600080fd5b8063156e29f6116100f4578063156e29f6146101b65780632a55205a146101c95780632eb2c2d6146101fb5780634e1273f41461020e578063715018a61461022e57600080fd5b8062fdd58e1461013057806301ffc9a71461015657806306fdde03146101795780630e89341c1461018e578063143094db146101a1575b600080fd5b61014361013e366004611b07565b610327565b6040519081526020015b60405180910390f35b610169610164366004611c3b565b6103bd565b604051901515815260200161014d565b610181610410565b60405161014d9190611f1b565b61018161019c366004611c75565b61049e565b6101b46101af366004611c8e565b610540565b005b6101b46101c4366004611b33565b61061e565b6101dc6101d7366004611d2d565b610668565b604080516001600160a01b03909316835260208301919091520161014d565b6101b4610209366004611947565b61076e565b61022161021c366004611b68565b610805565b60405161014d9190611eda565b6101b461092f565b6101b4610244366004611cdc565b610965565b6004546040516001600160a01b03909116815260200161014d565b6101816109eb565b6101b461027a366004611ad4565b6109f8565b61018161028d366004611c75565b610a07565b6102a56102a0366004611c75565b610a20565b60405161014d9190611ec7565b6101b46102c0366004611a5e565b610aaf565b6101696102d336600461190e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b461030f3660046119f5565b610af4565b6101b46103223660046118f1565b610b7b565b60006001600160a01b0383166103975760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b14156103e057506001919050565b6001600160e01b0319821663152a902d60e11b141561040157506001919050565b61040a82610c16565b92915050565b6005805461041d90612161565b80601f016020809104026020016040519081016040528092919081815260200182805461044990612161565b80156104965780601f1061046b57610100808354040283529160200191610496565b820191906000526020600020905b81548152906001019060200180831161047957829003601f168201915b505050505081565b60008181526007602052604090208054606091906104bb90612161565b80601f01602080910402602001604051908101604052809291908181526020018280546104e790612161565b80156105345780601f1061050957610100808354040283529160200191610534565b820191906000526020600020905b81548152906001019060200180831161051757829003601f168201915b50505050509050919050565b6004546001600160a01b0316331461056a5760405162461bcd60e51b815260040161038e90612005565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161058157905050905081816000815181106105be576105be6121fa565b6020026020010151602001906001600160601b031690816001600160601b03168152505082816000815181106105f6576105f66121fa565b60209081029190910101516001600160a01b0390911690526106188482610c66565b50505050565b6004546001600160a01b031633146106485760405162461bcd60e51b815260040161038e90612005565b61066383838360405180602001604052806000815250610e81565b505050565b6000828152600360209081526040808320805482518185028101850190935280835284938493929190849084015b828210156106e557600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610696565b50505050905060008151111561075e5780600081518110610708576107086121fa565b6020026020010151600001516127108260008151811061072a5761072a6121fa565b6020026020010151602001516001600160601b03168661074a9190612142565b6107549190612120565b9250925050610767565b60008092509250505b9250929050565b6001600160a01b03851633148061078a575061078a85336102d3565b6107f15760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161038e565b6107fe8585858585610f5b565b5050505050565b6060815183511461086a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161038e565b6000835167ffffffffffffffff81111561088657610886612210565b6040519080825280602002602001820160405280156108af578160200160208202803683370190505b50905060005b8451811015610927576108fa8582815181106108d3576108d36121fa565b60200260200101518583815181106108ed576108ed6121fa565b6020026020010151610327565b82828151811061090c5761090c6121fa565b6020908102919091010152610920816121c9565b90506108b5565b509392505050565b6004546001600160a01b031633146109595760405162461bcd60e51b815260040161038e90612005565b61096360006110f7565b565b6004546001600160a01b0316331461098f5760405162461bcd60e51b815260040161038e90612005565b600082815260076020908152604090912082516109ae9284019061175c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516109df9190611f1b565b60405180910390a25050565b6006805461041d90612161565b610a03338383611149565b5050565b6007602052600090815260409020805461041d90612161565b606060036000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aa457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610a55565b505050509050919050565b6004546001600160a01b03163314610ad95760405162461bcd60e51b815260040161038e90612005565b6106638383836040518060200160405280600081525061122a565b6001600160a01b038516331480610b105750610b1085336102d3565b610b6e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161038e565b6107fe8585858585611375565b6004546001600160a01b03163314610ba55760405162461bcd60e51b815260040161038e90612005565b6001600160a01b038116610c0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161038e565b610c13816110f7565b50565b60006001600160e01b03198216636cdb3d1360e11b1480610c4757506001600160e01b031982166303a24d0760e21b145b8061040a57506301ffc9a760e01b6001600160e01b031983161461040a565b6000805b8251811015610e175760006001600160a01b0316838281518110610c9057610c906121fa565b6020026020010151600001516001600160a01b03161415610cf35760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640161038e565b828181518110610d0557610d056121fa565b6020026020010151602001516001600160601b031660001415610d6a5760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640161038e565b828181518110610d7c57610d7c6121fa565b6020026020010151602001516001600160601b031682610d9c9190612108565b915060036000858152602001908152602001600020838281518110610dc357610dc36121fa565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b039091161791015580610e0f816121c9565b915050610c6a565b506127108110610e775760405162461bcd60e51b815260206004820152602560248201527f526f79616c747920746f74616c2076616c75652073686f756c64206265203c20604482015264031303030360dc1b606482015260840161038e565b610663838361149f565b6001600160a01b038416610ea75760405162461bcd60e51b815260040161038e90612082565b336000610eb3856114dc565b90506000610ec0856114dc565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610ef2908490612108565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f5283600089898989611527565b50505050505050565b8151835114610f7c5760405162461bcd60e51b815260040161038e9061203a565b6001600160a01b038416610fa25760405162461bcd60e51b815260040161038e90611f76565b3360005b8451811015611089576000858281518110610fc357610fc36121fa565b602002602001015190506000858381518110610fe157610fe16121fa565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156110315760405162461bcd60e51b815260040161038e90611fbb565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061106e908490612108565b9250508190555050505080611082906121c9565b9050610fa6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110d9929190611eed565b60405180910390a46110ef818787878787611692565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111bd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161038e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166112505760405162461bcd60e51b815260040161038e90612082565b81518351146112715760405162461bcd60e51b815260040161038e9061203a565b3360005b845181101561130d57838181518110611290576112906121fa565b60200260200101516000808784815181106112ad576112ad6121fa565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112f59190612108565b90915550819050611305816121c9565b915050611275565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161135e929190611eed565b60405180910390a46107fe81600087878787611692565b6001600160a01b03841661139b5760405162461bcd60e51b815260040161038e90611f76565b3360006113a7856114dc565b905060006113b4856114dc565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156113f75760405162461bcd60e51b815260040161038e90611fbb565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611434908490612108565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611494848a8a8a8a8a611527565b505050505050505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df82826040516114d09291906120c3565b60405180910390a15050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611516576115166121fa565b602090810291909101015292915050565b6001600160a01b0384163b156110ef5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061156b9089908990889088908890600401611e82565b602060405180830381600087803b15801561158557600080fd5b505af19250505080156115b5575060408051601f3d908101601f191682019092526115b291810190611c58565b60015b611662576115c1612226565b806308c379a014156115fb57506115d6612242565b806115e157506115fd565b8060405162461bcd60e51b815260040161038e9190611f1b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161038e565b6001600160e01b0319811663f23a6e6160e01b14610f525760405162461bcd60e51b815260040161038e90611f2e565b6001600160a01b0384163b156110ef5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906116d69089908990889088908890600401611e24565b602060405180830381600087803b1580156116f057600080fd5b505af1925050508015611720575060408051601f3d908101601f1916820190925261171d91810190611c58565b60015b61172c576115c1612226565b6001600160e01b0319811663bc197c8160e01b14610f525760405162461bcd60e51b815260040161038e90611f2e565b82805461176890612161565b90600052602060002090601f01602090048101928261178a57600085556117d0565b82601f106117a357805160ff19168380011785556117d0565b828001600101855582156117d0579182015b828111156117d05782518255916020019190600101906117b5565b506117dc9291506117e0565b5090565b5b808211156117dc57600081556001016117e1565b600067ffffffffffffffff83111561180f5761180f612210565b604051611826601f8501601f19166020018261219c565b80915083815284848401111561183b57600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261186457600080fd5b81356020611871826120e4565b60405161187e828261219c565b8381528281019150858301600585901b8701840188101561189e57600080fd5b60005b858110156118bd578135845292840192908401906001016118a1565b5090979650505050505050565b600082601f8301126118db57600080fd5b6118ea838335602085016117f5565b9392505050565b60006020828403121561190357600080fd5b81356118ea816122cc565b6000806040838503121561192157600080fd5b823561192c816122cc565b9150602083013561193c816122cc565b809150509250929050565b600080600080600060a0868803121561195f57600080fd5b853561196a816122cc565b9450602086013561197a816122cc565b9350604086013567ffffffffffffffff8082111561199757600080fd5b6119a389838a01611853565b945060608801359150808211156119b957600080fd5b6119c589838a01611853565b935060808801359150808211156119db57600080fd5b506119e8888289016118ca565b9150509295509295909350565b600080600080600060a08688031215611a0d57600080fd5b8535611a18816122cc565b94506020860135611a28816122cc565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a5257600080fd5b6119e8888289016118ca565b600080600060608486031215611a7357600080fd5b8335611a7e816122cc565b9250602084013567ffffffffffffffff80821115611a9b57600080fd5b611aa787838801611853565b93506040860135915080821115611abd57600080fd5b50611aca86828701611853565b9150509250925092565b60008060408385031215611ae757600080fd5b8235611af2816122cc565b91506020830135801515811461193c57600080fd5b60008060408385031215611b1a57600080fd5b8235611b25816122cc565b946020939093013593505050565b600080600060608486031215611b4857600080fd5b8335611b53816122cc565b95602085013595506040909401359392505050565b60008060408385031215611b7b57600080fd5b823567ffffffffffffffff80821115611b9357600080fd5b818501915085601f830112611ba757600080fd5b81356020611bb4826120e4565b604051611bc1828261219c565b8381528281019150858301600585901b870184018b1015611be157600080fd5b600096505b84871015611c0d578035611bf9816122cc565b835260019690960195918301918301611be6565b5096505086013592505080821115611c2457600080fd5b50611c3185828601611853565b9150509250929050565b600060208284031215611c4d57600080fd5b81356118ea816122e1565b600060208284031215611c6a57600080fd5b81516118ea816122e1565b600060208284031215611c8757600080fd5b5035919050565b600080600060608486031215611ca357600080fd5b833592506020840135611cb5816122cc565b915060408401356001600160601b0381168114611cd157600080fd5b809150509250925092565b60008060408385031215611cef57600080fd5b82359150602083013567ffffffffffffffff811115611d0d57600080fd5b8301601f81018513611d1e57600080fd5b611c31858235602084016117f5565b60008060408385031215611d4057600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015611d9c57815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101611d63565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9c57815187529582019590820190600101611dbb565b6000815180845260005b81811015611dfd57602081850181015186830182015201611de1565b81811115611e0f576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611e5090830186611da7565b8281036060840152611e628186611da7565b90508281036080840152611e768185611dd7565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611ebc90830184611dd7565b979650505050505050565b6020815260006118ea6020830184611d4f565b6020815260006118ea6020830184611da7565b604081526000611f006040830185611da7565b8281036020840152611f128185611da7565b95945050505050565b6020815260006118ea6020830184611dd7565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8281526040602082015260006120dc6040830184611d4f565b949350505050565b600067ffffffffffffffff8211156120fe576120fe612210565b5060051b60200190565b6000821982111561211b5761211b6121e4565b500190565b60008261213d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561215c5761215c6121e4565b500290565b600181811c9082168061217557607f821691505b6020821081141561219657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156121c2576121c2612210565b6040525050565b60006000198214156121dd576121dd6121e4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561223f5760046000803e5060005160e01c5b90565b600060443d10156122505790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561228057505050505090565b82850191508151818111156122985750505050505090565b843d87010160208285010111156122b25750505050505090565b6122c16020828601018761219c565b509095945050505050565b6001600160a01b0381168114610c1357600080fd5b6001600160e01b031981168114610c1357600080fdfea26469706673582212207d650c194af4ec3c0244f4700ed5a01b6b4da2f9f8dffb046f31999cde21268d64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012b5760003560e01c8063862440e2116100ad578063cad96cca11610071578063cad96cca14610292578063d81d0a15146102b2578063e985e9c5146102c5578063f242432a14610301578063f2fde38b1461031457600080fd5b8063862440e2146102365780638da5cb5b1461024957806395d89b4114610264578063a22cb4651461026c578063c87b56dd1461027f57600080fd5b8063156e29f6116100f4578063156e29f6146101b65780632a55205a146101c95780632eb2c2d6146101fb5780634e1273f41461020e578063715018a61461022e57600080fd5b8062fdd58e1461013057806301ffc9a71461015657806306fdde03146101795780630e89341c1461018e578063143094db146101a1575b600080fd5b61014361013e366004611b07565b610327565b6040519081526020015b60405180910390f35b610169610164366004611c3b565b6103bd565b604051901515815260200161014d565b610181610410565b60405161014d9190611f1b565b61018161019c366004611c75565b61049e565b6101b46101af366004611c8e565b610540565b005b6101b46101c4366004611b33565b61061e565b6101dc6101d7366004611d2d565b610668565b604080516001600160a01b03909316835260208301919091520161014d565b6101b4610209366004611947565b61076e565b61022161021c366004611b68565b610805565b60405161014d9190611eda565b6101b461092f565b6101b4610244366004611cdc565b610965565b6004546040516001600160a01b03909116815260200161014d565b6101816109eb565b6101b461027a366004611ad4565b6109f8565b61018161028d366004611c75565b610a07565b6102a56102a0366004611c75565b610a20565b60405161014d9190611ec7565b6101b46102c0366004611a5e565b610aaf565b6101696102d336600461190e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b461030f3660046119f5565b610af4565b6101b46103223660046118f1565b610b7b565b60006001600160a01b0383166103975760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b14156103e057506001919050565b6001600160e01b0319821663152a902d60e11b141561040157506001919050565b61040a82610c16565b92915050565b6005805461041d90612161565b80601f016020809104026020016040519081016040528092919081815260200182805461044990612161565b80156104965780601f1061046b57610100808354040283529160200191610496565b820191906000526020600020905b81548152906001019060200180831161047957829003601f168201915b505050505081565b60008181526007602052604090208054606091906104bb90612161565b80601f01602080910402602001604051908101604052809291908181526020018280546104e790612161565b80156105345780601f1061050957610100808354040283529160200191610534565b820191906000526020600020905b81548152906001019060200180831161051757829003601f168201915b50505050509050919050565b6004546001600160a01b0316331461056a5760405162461bcd60e51b815260040161038e90612005565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161058157905050905081816000815181106105be576105be6121fa565b6020026020010151602001906001600160601b031690816001600160601b03168152505082816000815181106105f6576105f66121fa565b60209081029190910101516001600160a01b0390911690526106188482610c66565b50505050565b6004546001600160a01b031633146106485760405162461bcd60e51b815260040161038e90612005565b61066383838360405180602001604052806000815250610e81565b505050565b6000828152600360209081526040808320805482518185028101850190935280835284938493929190849084015b828210156106e557600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610696565b50505050905060008151111561075e5780600081518110610708576107086121fa565b6020026020010151600001516127108260008151811061072a5761072a6121fa565b6020026020010151602001516001600160601b03168661074a9190612142565b6107549190612120565b9250925050610767565b60008092509250505b9250929050565b6001600160a01b03851633148061078a575061078a85336102d3565b6107f15760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161038e565b6107fe8585858585610f5b565b5050505050565b6060815183511461086a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161038e565b6000835167ffffffffffffffff81111561088657610886612210565b6040519080825280602002602001820160405280156108af578160200160208202803683370190505b50905060005b8451811015610927576108fa8582815181106108d3576108d36121fa565b60200260200101518583815181106108ed576108ed6121fa565b6020026020010151610327565b82828151811061090c5761090c6121fa565b6020908102919091010152610920816121c9565b90506108b5565b509392505050565b6004546001600160a01b031633146109595760405162461bcd60e51b815260040161038e90612005565b61096360006110f7565b565b6004546001600160a01b0316331461098f5760405162461bcd60e51b815260040161038e90612005565b600082815260076020908152604090912082516109ae9284019061175c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516109df9190611f1b565b60405180910390a25050565b6006805461041d90612161565b610a03338383611149565b5050565b6007602052600090815260409020805461041d90612161565b606060036000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aa457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610a55565b505050509050919050565b6004546001600160a01b03163314610ad95760405162461bcd60e51b815260040161038e90612005565b6106638383836040518060200160405280600081525061122a565b6001600160a01b038516331480610b105750610b1085336102d3565b610b6e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161038e565b6107fe8585858585611375565b6004546001600160a01b03163314610ba55760405162461bcd60e51b815260040161038e90612005565b6001600160a01b038116610c0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161038e565b610c13816110f7565b50565b60006001600160e01b03198216636cdb3d1360e11b1480610c4757506001600160e01b031982166303a24d0760e21b145b8061040a57506301ffc9a760e01b6001600160e01b031983161461040a565b6000805b8251811015610e175760006001600160a01b0316838281518110610c9057610c906121fa565b6020026020010151600001516001600160a01b03161415610cf35760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640161038e565b828181518110610d0557610d056121fa565b6020026020010151602001516001600160601b031660001415610d6a5760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640161038e565b828181518110610d7c57610d7c6121fa565b6020026020010151602001516001600160601b031682610d9c9190612108565b915060036000858152602001908152602001600020838281518110610dc357610dc36121fa565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b039091161791015580610e0f816121c9565b915050610c6a565b506127108110610e775760405162461bcd60e51b815260206004820152602560248201527f526f79616c747920746f74616c2076616c75652073686f756c64206265203c20604482015264031303030360dc1b606482015260840161038e565b610663838361149f565b6001600160a01b038416610ea75760405162461bcd60e51b815260040161038e90612082565b336000610eb3856114dc565b90506000610ec0856114dc565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610ef2908490612108565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f5283600089898989611527565b50505050505050565b8151835114610f7c5760405162461bcd60e51b815260040161038e9061203a565b6001600160a01b038416610fa25760405162461bcd60e51b815260040161038e90611f76565b3360005b8451811015611089576000858281518110610fc357610fc36121fa565b602002602001015190506000858381518110610fe157610fe16121fa565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156110315760405162461bcd60e51b815260040161038e90611fbb565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061106e908490612108565b9250508190555050505080611082906121c9565b9050610fa6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110d9929190611eed565b60405180910390a46110ef818787878787611692565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111bd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161038e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166112505760405162461bcd60e51b815260040161038e90612082565b81518351146112715760405162461bcd60e51b815260040161038e9061203a565b3360005b845181101561130d57838181518110611290576112906121fa565b60200260200101516000808784815181106112ad576112ad6121fa565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112f59190612108565b90915550819050611305816121c9565b915050611275565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161135e929190611eed565b60405180910390a46107fe81600087878787611692565b6001600160a01b03841661139b5760405162461bcd60e51b815260040161038e90611f76565b3360006113a7856114dc565b905060006113b4856114dc565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156113f75760405162461bcd60e51b815260040161038e90611fbb565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611434908490612108565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611494848a8a8a8a8a611527565b505050505050505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df82826040516114d09291906120c3565b60405180910390a15050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611516576115166121fa565b602090810291909101015292915050565b6001600160a01b0384163b156110ef5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061156b9089908990889088908890600401611e82565b602060405180830381600087803b15801561158557600080fd5b505af19250505080156115b5575060408051601f3d908101601f191682019092526115b291810190611c58565b60015b611662576115c1612226565b806308c379a014156115fb57506115d6612242565b806115e157506115fd565b8060405162461bcd60e51b815260040161038e9190611f1b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161038e565b6001600160e01b0319811663f23a6e6160e01b14610f525760405162461bcd60e51b815260040161038e90611f2e565b6001600160a01b0384163b156110ef5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906116d69089908990889088908890600401611e24565b602060405180830381600087803b1580156116f057600080fd5b505af1925050508015611720575060408051601f3d908101601f1916820190925261171d91810190611c58565b60015b61172c576115c1612226565b6001600160e01b0319811663bc197c8160e01b14610f525760405162461bcd60e51b815260040161038e90611f2e565b82805461176890612161565b90600052602060002090601f01602090048101928261178a57600085556117d0565b82601f106117a357805160ff19168380011785556117d0565b828001600101855582156117d0579182015b828111156117d05782518255916020019190600101906117b5565b506117dc9291506117e0565b5090565b5b808211156117dc57600081556001016117e1565b600067ffffffffffffffff83111561180f5761180f612210565b604051611826601f8501601f19166020018261219c565b80915083815284848401111561183b57600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261186457600080fd5b81356020611871826120e4565b60405161187e828261219c565b8381528281019150858301600585901b8701840188101561189e57600080fd5b60005b858110156118bd578135845292840192908401906001016118a1565b5090979650505050505050565b600082601f8301126118db57600080fd5b6118ea838335602085016117f5565b9392505050565b60006020828403121561190357600080fd5b81356118ea816122cc565b6000806040838503121561192157600080fd5b823561192c816122cc565b9150602083013561193c816122cc565b809150509250929050565b600080600080600060a0868803121561195f57600080fd5b853561196a816122cc565b9450602086013561197a816122cc565b9350604086013567ffffffffffffffff8082111561199757600080fd5b6119a389838a01611853565b945060608801359150808211156119b957600080fd5b6119c589838a01611853565b935060808801359150808211156119db57600080fd5b506119e8888289016118ca565b9150509295509295909350565b600080600080600060a08688031215611a0d57600080fd5b8535611a18816122cc565b94506020860135611a28816122cc565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a5257600080fd5b6119e8888289016118ca565b600080600060608486031215611a7357600080fd5b8335611a7e816122cc565b9250602084013567ffffffffffffffff80821115611a9b57600080fd5b611aa787838801611853565b93506040860135915080821115611abd57600080fd5b50611aca86828701611853565b9150509250925092565b60008060408385031215611ae757600080fd5b8235611af2816122cc565b91506020830135801515811461193c57600080fd5b60008060408385031215611b1a57600080fd5b8235611b25816122cc565b946020939093013593505050565b600080600060608486031215611b4857600080fd5b8335611b53816122cc565b95602085013595506040909401359392505050565b60008060408385031215611b7b57600080fd5b823567ffffffffffffffff80821115611b9357600080fd5b818501915085601f830112611ba757600080fd5b81356020611bb4826120e4565b604051611bc1828261219c565b8381528281019150858301600585901b870184018b1015611be157600080fd5b600096505b84871015611c0d578035611bf9816122cc565b835260019690960195918301918301611be6565b5096505086013592505080821115611c2457600080fd5b50611c3185828601611853565b9150509250929050565b600060208284031215611c4d57600080fd5b81356118ea816122e1565b600060208284031215611c6a57600080fd5b81516118ea816122e1565b600060208284031215611c8757600080fd5b5035919050565b600080600060608486031215611ca357600080fd5b833592506020840135611cb5816122cc565b915060408401356001600160601b0381168114611cd157600080fd5b809150509250925092565b60008060408385031215611cef57600080fd5b82359150602083013567ffffffffffffffff811115611d0d57600080fd5b8301601f81018513611d1e57600080fd5b611c31858235602084016117f5565b60008060408385031215611d4057600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015611d9c57815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101611d63565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9c57815187529582019590820190600101611dbb565b6000815180845260005b81811015611dfd57602081850181015186830182015201611de1565b81811115611e0f576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611e5090830186611da7565b8281036060840152611e628186611da7565b90508281036080840152611e768185611dd7565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611ebc90830184611dd7565b979650505050505050565b6020815260006118ea6020830184611d4f565b6020815260006118ea6020830184611da7565b604081526000611f006040830185611da7565b8281036020840152611f128185611da7565b95945050505050565b6020815260006118ea6020830184611dd7565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8281526040602082015260006120dc6040830184611d4f565b949350505050565b600067ffffffffffffffff8211156120fe576120fe612210565b5060051b60200190565b6000821982111561211b5761211b6121e4565b500190565b60008261213d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561215c5761215c6121e4565b500290565b600181811c9082168061217557607f821691505b6020821081141561219657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156121c2576121c2612210565b6040525050565b60006000198214156121dd576121dd6121e4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561223f5760046000803e5060005160e01c5b90565b600060443d10156122505790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561228057505050505090565b82850191508151818111156122985750505050505090565b843d87010160208285010111156122b25750505050505090565b6122c16020828601018761219c565b509095945050505050565b6001600160a01b0381168114610c1357600080fd5b6001600160e01b031981168114610c1357600080fdfea26469706673582212207d650c194af4ec3c0244f4700ed5a01b6b4da2f9f8dffb046f31999cde21268d64736f6c63430008070033
Deployed Bytecode Sourcemap
46260:1935:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30635:230;;;;;;:::i;:::-;;:::i;:::-;;;20456:25:1;;;20444:2;20429:18;30635:230:0;;;;;;;;47833:357;;;;;;:::i;:::-;;:::i;:::-;;;13650:14:1;;13643:22;13625:41;;13613:2;13598:18;47833:357:0;13485:187:1;46325:18:0;;;:::i;:::-;;;;;;;:::i;46981:101::-;;;;;;:::i;:::-;;:::i;47088:359::-;;;;;;:::i;:::-;;:::i;:::-;;46585:111;;;;;;:::i;:::-;;:::i;47453:373::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12352:32:1;;;12334:51;;12416:2;12401:18;;12394:34;;;;12307:18;47453:373:0;12160:274:1;32573:442:0;;;;;;:::i;:::-;;:::i;31031:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9478:103::-;;;:::i;46851:124::-;;;;;;:::i;:::-;;:::i;8827:87::-;8900:6;;8827:87;;-1:-1:-1;;;;;8900:6:0;;;10702:51:1;;10690:2;10675:18;8827:87:0;10556:203:1;46348:20:0;;;:::i;31628:155::-;;;;;;:::i;:::-;;:::i;46438:39::-;;;;;;:::i;:::-;;:::i;5479:137::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46702:143::-;;;;;;:::i;:::-;;:::i;31855:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31978:27:0;;;31954:4;31978:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31855:168;32095:401;;;;;;:::i;:::-;;:::i;9736:201::-;;;;;;:::i;:::-;;:::i;30635:230::-;30721:7;-1:-1:-1;;;;;30749:21:0;;30741:76;;;;-1:-1:-1;;;30741:76:0;;15750:2:1;30741:76:0;;;15732:21:1;15789:2;15769:18;;;15762:30;15828:34;15808:18;;;15801:62;-1:-1:-1;;;15879:18:1;;;15872:40;15929:19;;30741:76:0;;;;;;;;;-1:-1:-1;30835:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;30835:22:0;;;;;;;;;;;;30635:230::o;47833:357::-;47927:4;-1:-1:-1;;;;;;47947:55:0;;-1:-1:-1;;;47947:55:0;47944:98;;;-1:-1:-1;48026:4:0;;47833:357;-1:-1:-1;47833:357:0:o;47944:98::-;-1:-1:-1;;;;;;48055:36:0;;-1:-1:-1;;;48055:36:0;48052:77;;;-1:-1:-1;48113:4:0;;47833:357;-1:-1:-1;47833:357:0:o;48052:77::-;48146:36;48170:11;48146:23;:36::i;:::-;48139:43;47833:357;-1:-1:-1;;47833:357:0:o;46325:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46981:101::-;47063:13;;;;:8;:13;;;;;47056:20;;47034:13;;47063;47056:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46981:101;;;:::o;47088:359::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;47259:21:::1;::::0;;47278:1:::1;47259:21:::0;;;;;::::1;::::0;;;47224:32:::1;::::0;47259:21:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;47259:21:0::1;;;;;;;;;;;;;;;47224:56;;47313:22;47291:10;47302:1;47291:13;;;;;;;;:::i;:::-;;;;;;;:19;;:44;-1:-1:-1::0;;;;;47291:44:0::1;;;-1:-1:-1::0;;;;;47291:44:0::1;;;::::0;::::1;47370:27;47346:10;47357:1;47346:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;47346:51:0;;::::1;::::0;;47408:31:::1;47423:3:::0;47428:10;47408:14:::1;:31::i;:::-;47213:234;47088:359:::0;;;:::o;46585:111::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;46662:28:::1;46668:3;46673;46678:7;46662:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;46585:111:::0;;;:::o;47453:373::-;47547:16;47634:14;;;:9;:14;;;;;;;;47599:49;;;;;;;;;;;;;;;;;47547:16;;;;47599:49;47634:14;47599:49;47547:16;;47599:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47599:49:0;;;;-1:-1:-1;;;47599:49:0;;-1:-1:-1;;;;;47599:49:0;;;;;;;;;;;;;;;;;;;;;;47682:1;47662:10;:17;:21;47659:125;;;47708:10;47719:1;47708:13;;;;;;;;:::i;:::-;;;;;;;:21;;;47766:5;47745:10;47756:1;47745:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;47732:32:0;:10;:32;;;;:::i;:::-;47731:40;;;;:::i;:::-;47700:72;;;;;;;47659:125;47810:1;47814;47794:22;;;;;47453:373;;;;;;:::o;32573:442::-;-1:-1:-1;;;;;32806:20:0;;7578:10;32806:20;;:60;;-1:-1:-1;32830:36:0;32847:4;7578:10;31855:168;:::i;32830:36::-;32784:160;;;;-1:-1:-1;;;32784:160:0;;16928:2:1;32784:160:0;;;16910:21:1;16967:2;16947:18;;;16940:30;17006:34;16986:18;;;16979:62;-1:-1:-1;;;17057:18:1;;;17050:48;17115:19;;32784:160:0;16726:414:1;32784:160:0;32955:52;32978:4;32984:2;32988:3;32993:7;33002:4;32955:22;:52::i;:::-;32573:442;;;;;:::o;31031:524::-;31187:16;31248:3;:10;31229:8;:15;:29;31221:83;;;;-1:-1:-1;;;31221:83:0;;18935:2:1;31221:83:0;;;18917:21:1;18974:2;18954:18;;;18947:30;19013:34;18993:18;;;18986:62;-1:-1:-1;;;19064:18:1;;;19057:39;19113:19;;31221:83:0;18733:405:1;31221:83:0;31317:30;31364:8;:15;31350:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31350:30:0;;31317:63;;31398:9;31393:122;31417:8;:15;31413:1;:19;31393:122;;;31473:30;31483:8;31492:1;31483:11;;;;;;;;:::i;:::-;;;;;;;31496:3;31500:1;31496:6;;;;;;;;:::i;:::-;;;;;;;31473:9;:30::i;:::-;31454:13;31468:1;31454:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;31434:3;;;:::i;:::-;;;31393:122;;;-1:-1:-1;31534:13:0;31031:524;-1:-1:-1;;;31031:524:0:o;9478:103::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;9543:30:::1;9570:1;9543:18;:30::i;:::-;9478:103::o:0;46851:124::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;46923:13:::1;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;46965:3;46955:14;46959:4;46955:14;;;;;;:::i;:::-;;;;;;;;46851:124:::0;;:::o;46348:20::-;;;;;;;:::i;31628:155::-;31723:52;7578:10;31756:8;31766;31723:18;:52::i;:::-;31628:155;;:::o;46438:39::-;;;;;;;;;;;;;;;;:::i;5479:137::-;5554:21;5595:9;:13;5605:2;5595:13;;;;;;;;;;;5588:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5588:20:0;;;;-1:-1:-1;;;5588:20:0;;-1:-1:-1;;;;;5588:20:0;;;;;;;;;;;;;;;;;;;;;;5479:137;;;:::o;46702:143::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;46804:35:::1;46815:3;46820:4;46826:8;46804:35;;;;;;;;;;;::::0;:10:::1;:35::i;32095:401::-:0;-1:-1:-1;;;;;32303:20:0;;7578:10;32303:20;;:60;;-1:-1:-1;32327:36:0;32344:4;7578:10;31855:168;:::i;32327:36::-;32281:151;;;;-1:-1:-1;;;32281:151:0;;15340:2:1;32281:151:0;;;15322:21:1;15379:2;15359:18;;;15352:30;15418:34;15398:18;;;15391:62;-1:-1:-1;;;15469:18:1;;;15462:39;15518:19;;32281:151:0;15138:405:1;32281:151:0;32443:45;32461:4;32467:2;32471;32475:6;32483:4;32443:17;:45::i;9736:201::-;8900:6;;-1:-1:-1;;;;;8900:6:0;7578:10;9047:23;9039:68;;;;-1:-1:-1;;;9039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9825:22:0;::::1;9817:73;;;::::0;-1:-1:-1;;;9817:73:0;;14933:2:1;9817:73:0::1;::::0;::::1;14915:21:1::0;14972:2;14952:18;;;14945:30;15011:34;14991:18;;;14984:62;-1:-1:-1;;;15062:18:1;;;15055:36;15108:19;;9817:73:0::1;14731:402:1::0;9817:73:0::1;9901:28;9920:8;9901:18;:28::i;:::-;9736:201:::0;:::o;29658:310::-;29760:4;-1:-1:-1;;;;;;29797:41:0;;-1:-1:-1;;;29797:41:0;;:110;;-1:-1:-1;;;;;;;29855:52:0;;-1:-1:-1;;;29855:52:0;29797:110;:163;;;-1:-1:-1;;;;;;;;;;20848:40:0;;;29924:36;20739:157;4256:576;4346:18;;4375:329;4396:10;:17;4392:1;:21;4375:329;;;4476:3;-1:-1:-1;;;;;4443:37:0;:10;4454:1;4443:13;;;;;;;;:::i;:::-;;;;;;;:21;;;-1:-1:-1;;;;;4443:37:0;;;4435:77;;;;-1:-1:-1;;;4435:77:0;;20156:2:1;4435:77:0;;;20138:21:1;20195:2;20175:18;;;20168:30;20234:29;20214:18;;;20207:57;20281:18;;4435:77:0;19954:351:1;4435:77:0;4535:10;4546:1;4535:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;4535:24:0;4558:1;4535:24;;4527:69;;;;-1:-1:-1;;;4527:69:0;;16161:2:1;4527:69:0;;;16143:21:1;;;16180:18;;;16173:30;16239:34;16219:18;;;16212:62;16291:18;;4527:69:0;15959:356:1;4527:69:0;4625:10;4636:1;4625:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;4611:33:0;;;;;;:::i;:::-;;;4659:9;:13;4669:2;4659:13;;;;;;;;;;;4678:10;4689:1;4678:13;;;;;;;;:::i;:::-;;;;;;;;;;;;4659:33;;;;;;;-1:-1:-1;4659:33:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4659:33:0;-1:-1:-1;;;4659:33:0;-1:-1:-1;;;;;4659:33:0;;;;;;;4415:3;;;;:::i;:::-;;;;4375:329;;;;4735:5;4722:10;:18;4714:68;;;;-1:-1:-1;;;4714:68:0;;18119:2:1;4714:68:0;;;18101:21:1;18158:2;18138:18;;;18131:30;18197:34;18177:18;;;18170:62;-1:-1:-1;;;18248:18:1;;;18241:35;18293:19;;4714:68:0;17917:401:1;4714:68:0;4793:31;4809:2;4813:10;4793:15;:31::i;37275:729::-;-1:-1:-1;;;;;37428:16:0;;37420:62;;;;-1:-1:-1;;;37420:62:0;;;;;;;:::i;:::-;7578:10;37495:16;37560:21;37578:2;37560:17;:21::i;:::-;37537:44;;37592:24;37619:25;37637:6;37619:17;:25::i;:::-;37592:52;;37736:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37736:17:0;;;;;;;;;:27;;37757:6;;37736:9;:27;;37757:6;;37736:27;:::i;:::-;;;;-1:-1:-1;;37779:52:0;;;21047:25:1;;;21103:2;21088:18;;21081:34;;;-1:-1:-1;;;;;37779:52:0;;;;37812:1;;37779:52;;;;;;21020:18:1;37779:52:0;;;;;;;37922:74;37953:8;37971:1;37975:2;37979;37983:6;37991:4;37922:30;:74::i;:::-;37409:595;;;37275:729;;;;:::o;34811:1146::-;35038:7;:14;35024:3;:10;:28;35016:81;;;;-1:-1:-1;;;35016:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35116:16:0;;35108:66;;;;-1:-1:-1;;;35108:66:0;;;;;;;:::i;:::-;7578:10;35187:16;35304:421;35328:3;:10;35324:1;:14;35304:421;;;35360:10;35373:3;35377:1;35373:6;;;;;;;;:::i;:::-;;;;;;;35360:19;;35394:14;35411:7;35419:1;35411:10;;;;;;;;:::i;:::-;;;;;;;;;;;;35438:19;35460:13;;;;;;;;;;-1:-1:-1;;;;;35460:19:0;;;;;;;;;;;;35411:10;;-1:-1:-1;35502:21:0;;;;35494:76;;;;-1:-1:-1;;;35494:76:0;;;;;;;:::i;:::-;35614:9;:13;;;;;;;;;;;-1:-1:-1;;;;;35614:19:0;;;;;;;;;;35636:20;;;35614:42;;35686:17;;;;;;;:27;;35636:20;;35614:9;35686:27;;35636:20;;35686:27;:::i;:::-;;;;;;;;35345:380;;;35340:3;;;;:::i;:::-;;;35304:421;;;;35772:2;-1:-1:-1;;;;;35742:47:0;35766:4;-1:-1:-1;;;;;35742:47:0;35756:8;-1:-1:-1;;;;;35742:47:0;;35776:3;35781:7;35742:47;;;;;;;:::i;:::-;;;;;;;;35874:75;35910:8;35920:4;35926:2;35930:3;35935:7;35944:4;35874:35;:75::i;:::-;35005:952;34811:1146;;;;;:::o;10097:191::-;10190:6;;;-1:-1:-1;;;;;10207:17:0;;;-1:-1:-1;;;;;;10207:17:0;;;;;;;10240:40;;10190:6;;;10207:17;10190:6;;10240:40;;10171:16;;10240:40;10160:128;10097:191;:::o;41687:331::-;41842:8;-1:-1:-1;;;;;41833:17:0;:5;-1:-1:-1;;;;;41833:17:0;;;41825:71;;;;-1:-1:-1;;;41825:71:0;;18525:2:1;41825:71:0;;;18507:21:1;18564:2;18544:18;;;18537:30;18603:34;18583:18;;;18576:62;-1:-1:-1;;;18654:18:1;;;18647:39;18703:19;;41825:71:0;18323:405:1;41825:71:0;-1:-1:-1;;;;;41907:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41907:46:0;;;;;;;;;;41969:41;;13625::1;;;41969::0;;13598:18:1;41969:41:0;;;;;;;41687:331;;;:::o;38407:813::-;-1:-1:-1;;;;;38585:16:0;;38577:62;;;;-1:-1:-1;;;38577:62:0;;;;;;;:::i;:::-;38672:7;:14;38658:3;:10;:28;38650:81;;;;-1:-1:-1;;;38650:81:0;;;;;;;:::i;:::-;7578:10;38744:16;38867:103;38891:3;:10;38887:1;:14;38867:103;;;38948:7;38956:1;38948:10;;;;;;;;:::i;:::-;;;;;;;38923:9;:17;38933:3;38937:1;38933:6;;;;;;;;:::i;:::-;;;;;;;38923:17;;;;;;;;;;;:21;38941:2;-1:-1:-1;;;;;38923:21:0;-1:-1:-1;;;;;38923:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;38903:3:0;;-1:-1:-1;38903:3:0;;;:::i;:::-;;;;38867:103;;;;39023:2;-1:-1:-1;;;;;38987:53:0;39019:1;-1:-1:-1;;;;;38987:53:0;39001:8;-1:-1:-1;;;;;38987:53:0;;39027:3;39032:7;38987:53;;;;;;;:::i;:::-;;;;;;;;39131:81;39167:8;39185:1;39189:2;39193:3;39198:7;39207:4;39131:35;:81::i;33479:974::-;-1:-1:-1;;;;;33667:16:0;;33659:66;;;;-1:-1:-1;;;33659:66:0;;;;;;;:::i;:::-;7578:10;33738:16;33803:21;33821:2;33803:17;:21::i;:::-;33780:44;;33835:24;33862:25;33880:6;33862:17;:25::i;:::-;33835:52;;33973:19;33995:13;;;;;;;;;;;-1:-1:-1;;;;;33995:19:0;;;;;;;;;;34033:21;;;;34025:76;;;;-1:-1:-1;;;34025:76:0;;;;;;;:::i;:::-;34137:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34137:19:0;;;;;;;;;;34159:20;;;34137:42;;34201:17;;;;;;;:27;;34159:20;;34137:9;34201:27;;34159:20;;34201:27;:::i;:::-;;;;-1:-1:-1;;34246:46:0;;;21047:25:1;;;21103:2;21088:18;;21081:34;;;-1:-1:-1;;;;;34246:46:0;;;;;;;;;;;;;;21020:18:1;34246:46:0;;;;;;;34377:68;34408:8;34418:4;34424:2;34428;34432:6;34440:4;34377:30;:68::i;:::-;33648:805;;;;33479:974;;;;;:::o;5624:141::-;5729:28;5742:2;5746:10;5729:28;;;;;;;:::i;:::-;;;;;;;;5624:141;;:::o;45953:198::-;46073:16;;;46087:1;46073:16;;;;;;;;;46019;;46048:22;;46073:16;;;;;;;;;;;;-1:-1:-1;46073:16:0;46048:41;;46111:7;46100:5;46106:1;46100:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;46138:5;45953:198;-1:-1:-1;;45953:198:0:o;44380:744::-;-1:-1:-1;;;;;44595:13:0;;11876:19;:23;44591:526;;44631:72;;-1:-1:-1;;;44631:72:0;;-1:-1:-1;;;;;44631:38:0;;;;;:72;;44670:8;;44680:4;;44686:2;;44690:6;;44698:4;;44631:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44631:72:0;;;;;;;;-1:-1:-1;;44631:72:0;;;;;;;;;;;;:::i;:::-;;;44627:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44979:6;44972:14;;-1:-1:-1;;;44972:14:0;;;;;;;;:::i;44627:479::-;;;45028:62;;-1:-1:-1;;;45028:62:0;;14103:2:1;45028:62:0;;;14085:21:1;14142:2;14122:18;;;14115:30;14181:34;14161:18;;;14154:62;-1:-1:-1;;;14232:18:1;;;14225:50;14292:19;;45028:62:0;13901:416:1;44627:479:0;-1:-1:-1;;;;;;44753:55:0;;-1:-1:-1;;;44753:55:0;44749:154;;44833:50;;-1:-1:-1;;;44833:50:0;;;;;;;:::i;45132:813::-;-1:-1:-1;;;;;45372:13:0;;11876:19;:23;45368:570;;45408:79;;-1:-1:-1;;;45408:79:0;;-1:-1:-1;;;;;45408:43:0;;;;;:79;;45452:8;;45462:4;;45468:3;;45473:7;;45482:4;;45408:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45408:79:0;;;;;;;;-1:-1:-1;;45408:79:0;;;;;;;;;;;;:::i;:::-;;;45404:523;;;;:::i;:::-;-1:-1:-1;;;;;;45569:60:0;;-1:-1:-1;;;45569:60:0;45565:159;;45654:50;;-1:-1:-1;;;45654:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:735::-;541:5;594:3;587:4;579:6;575:17;571:27;561:55;;612:1;609;602:12;561:55;648:6;635:20;674:4;697:43;737:2;697:43;:::i;:::-;769:2;763:9;781:31;809:2;801:6;781:31;:::i;:::-;847:18;;;881:15;;;;-1:-1:-1;916:15:1;;;966:1;962:10;;;950:23;;946:32;;943:41;-1:-1:-1;940:61:1;;;997:1;994;987:12;940:61;1019:1;1029:163;1043:2;1040:1;1037:9;1029:163;;;1100:17;;1088:30;;1138:12;;;;1170;;;;1061:1;1054:9;1029:163;;;-1:-1:-1;1210:6:1;;487:735;-1:-1:-1;;;;;;;487:735:1:o;1227:220::-;1269:5;1322:3;1315:4;1307:6;1303:17;1299:27;1289:55;;1340:1;1337;1330:12;1289:55;1362:79;1437:3;1428:6;1415:20;1408:4;1400:6;1396:17;1362:79;:::i;:::-;1353:88;1227:220;-1:-1:-1;;;1227:220:1:o;1452:247::-;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1619:9;1606:23;1638:31;1663:5;1638:31;:::i;1704:388::-;1772:6;1780;1833:2;1821:9;1812:7;1808:23;1804:32;1801:52;;;1849:1;1846;1839:12;1801:52;1888:9;1875:23;1907:31;1932:5;1907:31;:::i;:::-;1957:5;-1:-1:-1;2014:2:1;1999:18;;1986:32;2027:33;1986:32;2027:33;:::i;:::-;2079:7;2069:17;;;1704:388;;;;;:::o;2097:1071::-;2251:6;2259;2267;2275;2283;2336:3;2324:9;2315:7;2311:23;2307:33;2304:53;;;2353:1;2350;2343:12;2304:53;2392:9;2379:23;2411:31;2436:5;2411:31;:::i;:::-;2461:5;-1:-1:-1;2518:2:1;2503:18;;2490:32;2531:33;2490:32;2531:33;:::i;:::-;2583:7;-1:-1:-1;2641:2:1;2626:18;;2613:32;2664:18;2694:14;;;2691:34;;;2721:1;2718;2711:12;2691:34;2744:61;2797:7;2788:6;2777:9;2773:22;2744:61;:::i;:::-;2734:71;;2858:2;2847:9;2843:18;2830:32;2814:48;;2887:2;2877:8;2874:16;2871:36;;;2903:1;2900;2893:12;2871:36;2926:63;2981:7;2970:8;2959:9;2955:24;2926:63;:::i;:::-;2916:73;;3042:3;3031:9;3027:19;3014:33;2998:49;;3072:2;3062:8;3059:16;3056:36;;;3088:1;3085;3078:12;3056:36;;3111:51;3154:7;3143:8;3132:9;3128:24;3111:51;:::i;:::-;3101:61;;;2097:1071;;;;;;;;:::o;3173:734::-;3277:6;3285;3293;3301;3309;3362:3;3350:9;3341:7;3337:23;3333:33;3330:53;;;3379:1;3376;3369:12;3330:53;3418:9;3405:23;3437:31;3462:5;3437:31;:::i;:::-;3487:5;-1:-1:-1;3544:2:1;3529:18;;3516:32;3557:33;3516:32;3557:33;:::i;:::-;3609:7;-1:-1:-1;3663:2:1;3648:18;;3635:32;;-1:-1:-1;3714:2:1;3699:18;;3686:32;;-1:-1:-1;3769:3:1;3754:19;;3741:33;3797:18;3786:30;;3783:50;;;3829:1;3826;3819:12;3783:50;3852:49;3893:7;3884:6;3873:9;3869:22;3852:49;:::i;3912:730::-;4039:6;4047;4055;4108:2;4096:9;4087:7;4083:23;4079:32;4076:52;;;4124:1;4121;4114:12;4076:52;4163:9;4150:23;4182:31;4207:5;4182:31;:::i;:::-;4232:5;-1:-1:-1;4288:2:1;4273:18;;4260:32;4311:18;4341:14;;;4338:34;;;4368:1;4365;4358:12;4338:34;4391:61;4444:7;4435:6;4424:9;4420:22;4391:61;:::i;:::-;4381:71;;4505:2;4494:9;4490:18;4477:32;4461:48;;4534:2;4524:8;4521:16;4518:36;;;4550:1;4547;4540:12;4518:36;;4573:63;4628:7;4617:8;4606:9;4602:24;4573:63;:::i;:::-;4563:73;;;3912:730;;;;;:::o;4647:416::-;4712:6;4720;4773:2;4761:9;4752:7;4748:23;4744:32;4741:52;;;4789:1;4786;4779:12;4741:52;4828:9;4815:23;4847:31;4872:5;4847:31;:::i;:::-;4897:5;-1:-1:-1;4954:2:1;4939:18;;4926:32;4996:15;;4989:23;4977:36;;4967:64;;5027:1;5024;5017:12;5068:315;5136:6;5144;5197:2;5185:9;5176:7;5172:23;5168:32;5165:52;;;5213:1;5210;5203:12;5165:52;5252:9;5239:23;5271:31;5296:5;5271:31;:::i;:::-;5321:5;5373:2;5358:18;;;;5345:32;;-1:-1:-1;;;5068:315:1:o;5388:383::-;5465:6;5473;5481;5534:2;5522:9;5513:7;5509:23;5505:32;5502:52;;;5550:1;5547;5540:12;5502:52;5589:9;5576:23;5608:31;5633:5;5608:31;:::i;:::-;5658:5;5710:2;5695:18;;5682:32;;-1:-1:-1;5761:2:1;5746:18;;;5733:32;;5388:383;-1:-1:-1;;;5388:383:1:o;5776:1288::-;5894:6;5902;5955:2;5943:9;5934:7;5930:23;5926:32;5923:52;;;5971:1;5968;5961:12;5923:52;6011:9;5998:23;6040:18;6081:2;6073:6;6070:14;6067:34;;;6097:1;6094;6087:12;6067:34;6135:6;6124:9;6120:22;6110:32;;6180:7;6173:4;6169:2;6165:13;6161:27;6151:55;;6202:1;6199;6192:12;6151:55;6238:2;6225:16;6260:4;6283:43;6323:2;6283:43;:::i;:::-;6355:2;6349:9;6367:31;6395:2;6387:6;6367:31;:::i;:::-;6433:18;;;6467:15;;;;-1:-1:-1;6502:11:1;;;6544:1;6540:10;;;6532:19;;6528:28;;6525:41;-1:-1:-1;6522:61:1;;;6579:1;6576;6569:12;6522:61;6601:1;6592:10;;6611:238;6625:2;6622:1;6619:9;6611:238;;;6696:3;6683:17;6713:31;6738:5;6713:31;:::i;:::-;6757:18;;6643:1;6636:9;;;;;6795:12;;;;6827;;6611:238;;;-1:-1:-1;6868:6:1;-1:-1:-1;;6912:18:1;;6899:32;;-1:-1:-1;;6943:16:1;;;6940:36;;;6972:1;6969;6962:12;6940:36;;6995:63;7050:7;7039:8;7028:9;7024:24;6995:63;:::i;:::-;6985:73;;;5776:1288;;;;;:::o;7069:245::-;7127:6;7180:2;7168:9;7159:7;7155:23;7151:32;7148:52;;;7196:1;7193;7186:12;7148:52;7235:9;7222:23;7254:30;7278:5;7254:30;:::i;7319:249::-;7388:6;7441:2;7429:9;7420:7;7416:23;7412:32;7409:52;;;7457:1;7454;7447:12;7409:52;7489:9;7483:16;7508:30;7532:5;7508:30;:::i;7573:180::-;7632:6;7685:2;7673:9;7664:7;7660:23;7656:32;7653:52;;;7701:1;7698;7691:12;7653:52;-1:-1:-1;7724:23:1;;7573:180;-1:-1:-1;7573:180:1:o;7758:511::-;7842:6;7850;7858;7911:2;7899:9;7890:7;7886:23;7882:32;7879:52;;;7927:1;7924;7917:12;7879:52;7963:9;7950:23;7940:33;;8023:2;8012:9;8008:18;7995:32;8036:31;8061:5;8036:31;:::i;:::-;8086:5;-1:-1:-1;8143:2:1;8128:18;;8115:32;-1:-1:-1;;;;;8178:40:1;;8166:53;;8156:81;;8233:1;8230;8223:12;8156:81;8256:7;8246:17;;;7758:511;;;;;:::o;8274:518::-;8352:6;8360;8413:2;8401:9;8392:7;8388:23;8384:32;8381:52;;;8429:1;8426;8419:12;8381:52;8465:9;8452:23;8442:33;;8526:2;8515:9;8511:18;8498:32;8553:18;8545:6;8542:30;8539:50;;;8585:1;8582;8575:12;8539:50;8608:22;;8661:4;8653:13;;8649:27;-1:-1:-1;8639:55:1;;8690:1;8687;8680:12;8639:55;8713:73;8778:7;8773:2;8760:16;8755:2;8751;8747:11;8713:73;:::i;8797:248::-;8865:6;8873;8926:2;8914:9;8905:7;8901:23;8897:32;8894:52;;;8942:1;8939;8932:12;8894:52;-1:-1:-1;;8965:23:1;;;9035:2;9020:18;;;9007:32;;-1:-1:-1;8797:248:1:o;9050:585::-;9107:3;9145:5;9139:12;9172:6;9167:3;9160:19;9198:4;9227:2;9222:3;9218:12;9211:19;;9264:2;9257:5;9253:14;9285:1;9295:315;9309:6;9306:1;9303:13;9295:315;;;9368:13;;9410:9;;-1:-1:-1;;;;;9406:35:1;9394:48;;9486:11;;9480:18;-1:-1:-1;;;;;9476:51:1;9462:12;;;9455:73;9557:4;9548:14;;;;9585:15;;;;9438:1;9324:9;9295:315;;;-1:-1:-1;9626:3:1;;9050:585;-1:-1:-1;;;;;9050:585:1:o;9640:435::-;9693:3;9731:5;9725:12;9758:6;9753:3;9746:19;9784:4;9813:2;9808:3;9804:12;9797:19;;9850:2;9843:5;9839:14;9871:1;9881:169;9895:6;9892:1;9889:13;9881:169;;;9956:13;;9944:26;;9990:12;;;;10025:15;;;;9917:1;9910:9;9881:169;;10080:471;10121:3;10159:5;10153:12;10186:6;10181:3;10174:19;10211:1;10221:162;10235:6;10232:1;10229:13;10221:162;;;10297:4;10353:13;;;10349:22;;10343:29;10325:11;;;10321:20;;10314:59;10250:12;10221:162;;;10401:6;10398:1;10395:13;10392:87;;;10467:1;10460:4;10451:6;10446:3;10442:16;10438:27;10431:38;10392:87;-1:-1:-1;10533:2:1;10512:15;-1:-1:-1;;10508:29:1;10499:39;;;;10540:4;10495:50;;10080:471;-1:-1:-1;;10080:471:1:o;10764:826::-;-1:-1:-1;;;;;11161:15:1;;;11143:34;;11213:15;;11208:2;11193:18;;11186:43;11123:3;11260:2;11245:18;;11238:31;;;11086:4;;11292:57;;11329:19;;11321:6;11292:57;:::i;:::-;11397:9;11389:6;11385:22;11380:2;11369:9;11365:18;11358:50;11431:44;11468:6;11460;11431:44;:::i;:::-;11417:58;;11524:9;11516:6;11512:22;11506:3;11495:9;11491:19;11484:51;11552:32;11577:6;11569;11552:32;:::i;:::-;11544:40;10764:826;-1:-1:-1;;;;;;;;10764:826:1:o;11595:560::-;-1:-1:-1;;;;;11892:15:1;;;11874:34;;11944:15;;11939:2;11924:18;;11917:43;11991:2;11976:18;;11969:34;;;12034:2;12019:18;;12012:34;;;11854:3;12077;12062:19;;12055:32;;;11817:4;;12104:45;;12129:19;;12121:6;12104:45;:::i;:::-;12096:53;11595:560;-1:-1:-1;;;;;;;11595:560:1:o;12439:305::-;12658:2;12647:9;12640:21;12621:4;12678:60;12734:2;12723:9;12719:18;12711:6;12678:60;:::i;12749:261::-;12928:2;12917:9;12910:21;12891:4;12948:56;13000:2;12989:9;12985:18;12977:6;12948:56;:::i;13015:465::-;13272:2;13261:9;13254:21;13235:4;13298:56;13350:2;13339:9;13335:18;13327:6;13298:56;:::i;:::-;13402:9;13394:6;13390:22;13385:2;13374:9;13370:18;13363:50;13430:44;13467:6;13459;13430:44;:::i;:::-;13422:52;13015:465;-1:-1:-1;;;;;13015:465:1:o;13677:219::-;13826:2;13815:9;13808:21;13789:4;13846:44;13886:2;13875:9;13871:18;13863:6;13846:44;:::i;14322:404::-;14524:2;14506:21;;;14563:2;14543:18;;;14536:30;14602:34;14597:2;14582:18;;14575:62;-1:-1:-1;;;14668:2:1;14653:18;;14646:38;14716:3;14701:19;;14322:404::o;16320:401::-;16522:2;16504:21;;;16561:2;16541:18;;;16534:30;16600:34;16595:2;16580:18;;16573:62;-1:-1:-1;;;16666:2:1;16651:18;;16644:35;16711:3;16696:19;;16320:401::o;17145:406::-;17347:2;17329:21;;;17386:2;17366:18;;;17359:30;17425:34;17420:2;17405:18;;17398:62;-1:-1:-1;;;17491:2:1;17476:18;;17469:40;17541:3;17526:19;;17145:406::o;17556:356::-;17758:2;17740:21;;;17777:18;;;17770:30;17836:34;17831:2;17816:18;;17809:62;17903:2;17888:18;;17556:356::o;19143:404::-;19345:2;19327:21;;;19384:2;19364:18;;;19357:30;19423:34;19418:2;19403:18;;19396:62;-1:-1:-1;;;19489:2:1;19474:18;;19467:38;19537:3;19522:19;;19143:404::o;19552:397::-;19754:2;19736:21;;;19793:2;19773:18;;;19766:30;19832:34;19827:2;19812:18;;19805:62;-1:-1:-1;;;19898:2:1;19883:18;;19876:31;19939:3;19924:19;;19552:397::o;20492:376::-;20739:6;20728:9;20721:25;20782:2;20777;20766:9;20762:18;20755:30;20702:4;20802:60;20858:2;20847:9;20843:18;20835:6;20802:60;:::i;:::-;20794:68;20492:376;-1:-1:-1;;;;20492:376:1:o;21126:183::-;21186:4;21219:18;21211:6;21208:30;21205:56;;;21241:18;;:::i;:::-;-1:-1:-1;21286:1:1;21282:14;21298:4;21278:25;;21126:183::o;21314:128::-;21354:3;21385:1;21381:6;21378:1;21375:13;21372:39;;;21391:18;;:::i;:::-;-1:-1:-1;21427:9:1;;21314:128::o;21447:217::-;21487:1;21513;21503:132;;21557:10;21552:3;21548:20;21545:1;21538:31;21592:4;21589:1;21582:15;21620:4;21617:1;21610:15;21503:132;-1:-1:-1;21649:9:1;;21447:217::o;21669:168::-;21709:7;21775:1;21771;21767:6;21763:14;21760:1;21757:21;21752:1;21745:9;21738:17;21734:45;21731:71;;;21782:18;;:::i;:::-;-1:-1:-1;21822:9:1;;21669:168::o;21842:380::-;21921:1;21917:12;;;;21964;;;21985:61;;22039:4;22031:6;22027:17;22017:27;;21985:61;22092:2;22084:6;22081:14;22061:18;22058:38;22055:161;;;22138:10;22133:3;22129:20;22126:1;22119:31;22173:4;22170:1;22163:15;22201:4;22198:1;22191:15;22055:161;;21842:380;;;:::o;22227:249::-;22337:2;22318:13;;-1:-1:-1;;22314:27:1;22302:40;;22372:18;22357:34;;22393:22;;;22354:62;22351:88;;;22419:18;;:::i;:::-;22455:2;22448:22;-1:-1:-1;;22227:249:1:o;22481:135::-;22520:3;-1:-1:-1;;22541:17:1;;22538:43;;;22561:18;;:::i;:::-;-1:-1:-1;22608:1:1;22597:13;;22481:135::o;22621:127::-;22682:10;22677:3;22673:20;22670:1;22663:31;22713:4;22710:1;22703:15;22737:4;22734:1;22727:15;22753:127;22814:10;22809:3;22805:20;22802:1;22795:31;22845:4;22842:1;22835:15;22869:4;22866:1;22859:15;22885:127;22946:10;22941:3;22937:20;22934:1;22927:31;22977:4;22974:1;22967:15;23001:4;22998:1;22991:15;23017:179;23052:3;23094:1;23076:16;23073:23;23070:120;;;23140:1;23137;23134;23119:23;-1:-1:-1;23177:1:1;23171:8;23166:3;23162:18;23070:120;23017:179;:::o;23201:671::-;23240:3;23282:4;23264:16;23261:26;23258:39;;;23201:671;:::o;23258:39::-;23324:2;23318:9;-1:-1:-1;;23389:16:1;23385:25;;23382:1;23318:9;23361:50;23440:4;23434:11;23464:16;23499:18;23570:2;23563:4;23555:6;23551:17;23548:25;23543:2;23535:6;23532:14;23529:45;23526:58;;;23577:5;;;;;23201:671;:::o;23526:58::-;23614:6;23608:4;23604:17;23593:28;;23650:3;23644:10;23677:2;23669:6;23666:14;23663:27;;;23683:5;;;;;;23201:671;:::o;23663:27::-;23767:2;23748:16;23742:4;23738:27;23734:36;23727:4;23718:6;23713:3;23709:16;23705:27;23702:69;23699:82;;;23774:5;;;;;;23201:671;:::o;23699:82::-;23790:57;23841:4;23832:6;23824;23820:19;23816:30;23810:4;23790:57;:::i;:::-;-1:-1:-1;23863:3:1;;23201:671;-1:-1:-1;;;;;23201:671:1:o;23877:131::-;-1:-1:-1;;;;;23952:31:1;;23942:42;;23932:70;;23998:1;23995;23988:12;24013:131;-1:-1:-1;;;;;;24087:32:1;;24077:43;;24067:71;;24134:1;24131;24124:12
Swarm Source
ipfs://7d650c194af4ec3c0244f4700ed5a01b6b4da2f9f8dffb046f31999cde21268d
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.