ERC-1155
Music
Overview
Max Total Supply
131 SANPASS
Holders
81
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:
SANPASS
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 33333 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.20; /** ███████╗ █████╗ ███╗ ██╗ * ██╔════╝██╔══██╗████╗ ██║ * ███████╗███████║██╔██╗ ██║ * ╚════██║██╔══██║██║╚██╗██║ * ███████║██║ ██║██║ ╚████║ * ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ * * █████████████╗ * ╚════════════╝ * ███████████╗ * ╚══════════╝ * █████████████████╗ * ╚════════════════╝ * * ██████╗ █████╗ ███████╗███████╗ * ██╔══██╗██╔══██╗██╔════╝██╔════╝ * ██████╔╝███████║███████╗███████╗ * ██╔═══╝ ██╔══██║╚════██║╚════██║ * ██║ ██║ ██║███████║███████║ * ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝ */ import "./token/ERC2981ContractWideRoyalties.sol"; import "./token/TokenRescuer.sol"; import "./ISAN.sol"; import "./ISANPASS.sol"; import "./SAN1155Burnable.sol"; import "./SANMetadata.sol"; import "./SANSoulbindable.sol"; /** * @title SAN Concert Pass * @author Aaron Hanson <[email protected]> @CoffeeConverter * @notice https://sansound.io */ contract SANPASS is ISANPASS, SAN1155Burnable, ERC2981ContractWideRoyalties, TokenRescuer, SANMetadata, SANSoulbindable { uint256 public constant MAX_ROYALTIES_PCT = 333; // 3.33% address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; uint256 private constant MaskChi = 1<<0; uint256 private constant MaskUmi = 1<<1; uint256 private constant MaskSora = 1<<2; uint256 private constant MaskMecha = 1<<3; ISAN public immutable SAN; string public contractURI; SaleState public saleState; mapping(address => factionCredits) public userFactionCredits; constructor( string memory _contractURI, string memory _baseURI, address _royaltiesReceiver, uint256 _royaltiesPercent, address _sanContract ) SAN1155(_baseURI) { contractURI = _contractURI; setRoyalties( _royaltiesReceiver, _royaltiesPercent ); SAN = ISAN(_sanContract); } /** * @notice Mints SANPASS tokens by burning SAN Origin tokens. * @param _tokenIds The list of SAN Origin tokens to burn. */ function mintPasses( uint256[] calldata _tokenIds ) external { if (saleState != SaleState.Open) revert SaleStateNotActive(); factionCredits memory credits = userFactionCredits[_msgSender()]; unchecked { for (uint i; i < _tokenIds.length; ++i) { uint256 factions = sanTokenFactions(_tokenIds[i]); if (factions == 0) ++credits.none; else if (0 < factions & MaskMecha) ++credits.mecha; else { if (0 < factions & MaskChi) ++credits.chi; if (0 < factions & MaskUmi) ++credits.umi; if (0 < factions & MaskSora) ++credits.sora; } } } unchecked { uint256 mintChi = credits.chi / 3; uint256 mintUmi = credits.umi / 3; uint256 mintSora = credits.sora / 3; uint256 mintMecha = credits.mecha / 3; uint256 mintNone = credits.none / 3; uint256 idCount = (mintChi == 0 ? 0 : 1) + (mintUmi == 0 ? 0 : 1) + (mintSora == 0 ? 0 : 1) + (mintMecha == 0 ? 0 : 1) + (mintNone == 0 ? 0 : 1); if (1 == idCount) { if (mintChi != 0) { _mintSimple(_msgSender(), uint256(Id.Chi), mintChi); credits.chi = credits.chi % 3; } else if (mintUmi != 0) { _mintSimple(_msgSender(), uint256(Id.Umi), mintUmi); credits.umi = credits.umi % 3; } else if (mintSora != 0) { _mintSimple(_msgSender(), uint256(Id.Sora), mintSora); credits.sora = credits.sora % 3; } else if (mintMecha != 0) { _mintSimple(_msgSender(), uint256(Id.Mecha), mintMecha); credits.mecha = credits.mecha % 3; } else { _mintSimple(_msgSender(), uint256(Id.None), mintNone); credits.none = credits.none % 3; } } else if (1 < idCount) { uint256[] memory ids = new uint256[](idCount); uint256[] memory amounts = new uint256[](idCount); uint256 curIndex; if (mintChi != 0) { ids[curIndex] = uint256(Id.Chi); amounts[curIndex++] = mintChi; credits.chi = credits.chi % 3; } if (mintUmi != 0) { ids[curIndex] = uint256(Id.Umi); amounts[curIndex++] = mintUmi; credits.umi = credits.umi % 3; } if (mintSora != 0) { ids[curIndex] = uint256(Id.Sora); amounts[curIndex++] = mintSora; credits.sora = credits.sora % 3; } if (mintMecha != 0) { ids[curIndex] = uint256(Id.Mecha); amounts[curIndex++] = mintMecha; credits.mecha = credits.mecha % 3; } if (mintNone != 0) { ids[curIndex] = uint256(Id.None); amounts[curIndex] = mintNone; credits.none = credits.none % 3; } _mintBatchSimple(_msgSender(), ids, amounts); } } userFactionCredits[_msgSender()] = credits; SAN.batchTransferFrom(_msgSender(), BURN_ADDRESS, _tokenIds); emit Sacrifice(_msgSender()); } /** * @notice (only owner) Mints VIP tokens to a list of recipients. * @param _recipients The list of token recipients. * @param _amounts The list of token amounts. */ function airdropVIP( address[] calldata _recipients, uint256[] calldata _amounts ) external onlyOwner { if (_recipients.length != _amounts.length) revert ArrayLengthMismatch(); unchecked { for (uint i; i < _recipients.length; ++i) { _mintSimple( _recipients[i], uint256(Id.VIP), _amounts[i] ); } } } /** * @notice (only owner) Mints Redvoxx tokens to a list of recipients. * @param _recipients The list of token recipients. * @param _amounts The list of token amounts. */ function airdropRedvoxx( address[] calldata _recipients, uint256[] calldata _amounts ) external onlyOwner { if (_recipients.length != _amounts.length) revert ArrayLengthMismatch(); unchecked { for (uint i; i < _recipients.length; ++i) { _mintSimple( _recipients[i], uint256(Id.Redvoxx), _amounts[i] ); } } } /** * @notice (only owner) Sets the contract URI for contract metadata. * @param _newContractURI The new contract URI. */ function setContractURI( string calldata _newContractURI ) external onlyOwner { contractURI = _newContractURI; } /** * @notice (only owner) Sets the saleState to `_newSaleState`. * @param _newSaleState The new sale state * (0=Paused, 1=Open). */ function setSaleState( SaleState _newSaleState ) external onlyOwner { saleState = _newSaleState; emit SaleStateChanged(_newSaleState); } /** * @notice (only owner) Sets the token URI for token metadata. * @param _newURI The new URI. */ function setURI( string calldata _newURI ) external onlyOwner { _setURI(_newURI); } /** * @notice (only owner) Sets ERC-2981 royalties recipient and percentage. * @param _recipient The address to which to send royalties. * @param _value The royalties percentage (two decimals, e.g. 1000 = 10%). */ function setRoyalties( address _recipient, uint256 _value ) public onlyOwner { if (_value > MAX_ROYALTIES_PCT) revert ExceedsMaxRoyaltiesPercentage(); _setRoyalties( _recipient, _value ); } /** * @notice Looks up all factions for a SAN token ID. * @param _sanTokenId The SAN token ID to check. * @return factions_ Bitfield of five bits indication the factions. */ function sanTokenFactions( uint256 _sanTokenId ) public view returns (uint256 factions_) { uint256 bucket = _sanTokenId >> 6; factions_ = sanFactions[bucket] >> ((_sanTokenId & 63) * 4) & 0xf; } /** * @inheritdoc ERC165 */ function supportsInterface( bytes4 _interfaceId ) public view override (SAN1155, ERC2981Base) returns (bool) { return super.supportsInterface(_interfaceId); } string[119] public _takeThisEngineerMayItServeYouWell = [ "201110", "010110", "000110", "012010", "210100", "220110", "120110", "001110", "100110", "210100", "220110", "020110", "121010", "210100", "102010", "200110", "121010", "210100", "002010", "022010", "120110", "001110", "100110", "210100", "202010", "001110", "020110", "220110", "101000", "010110", "112010", "210100", "120110", "100110", "212010", "220110", "111110", "212010", "020110", "210100", "202010", "020110", "202010", "212010", "201110", "210100", "102010", "202010", "002010", "022010", "012010", "022010", "020110", "002010", "121010", "120110", "101000", "100110", "020110", "121010", "201110", "120110", "210100", "002010", "022010", "220110", "110110", "111110", "020110", "002010", "210100", "121010", "210100", "202010", "200110", "022010", "201110", "220110", "200110", "202010", "210100", "120110", "202010", "220110", "010110", "200110", "101000", "100110", "020110", "010110", "012010", "120110", "200110", "121010", "020110", "220110", "210100", "120110", "200110", "010110", "022010", "220110", "002010", "121010", "012010", "210100", "000110", "000110", "121010", "210100", "012010", "010110", "210100", "120110", "220110", "120110", "121010", "202010", "221010" ]; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./SANSoulbindable.sol"; interface ISAN is SANSoulbindable { function tokenLevel(uint256 _tokenId) external view returns (SoulboundLevel _level); function transferFrom( address _from, address _to, uint256 _tokenId ) external; function batchTransferFrom( address _from, address _to, uint256[] calldata _tokenIDs ) external; function ownerOf(uint256 _tokenId) external view returns (address owner); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.20; interface ISANPASS { struct factionCredits { uint8 chi; uint8 umi; uint8 sora; uint8 mecha; uint8 none; } enum Id { UNUSED, Chi, Umi, Sora, Mecha, None, VIP, Redvoxx } enum SaleState { Paused, // 0 Open // 1 } event Sacrifice( address indexed sacrificer ); event SaleStateChanged( SaleState newSaleState ); error ExceedsMaxRoyaltiesPercentage(); error SaleStateNotActive(); }
// SPDX-License-Identifier: MIT // Based on OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @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 SAN1155 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 token owner or 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: caller is not token owner or 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 Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. */ function _mintSimple( address to, uint256 id, uint256 amount ) internal virtual { _balances[id][to] += amount; emit TransferSingle(_msgSender(), address(0), to, id, amount); } /** * @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 xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _mintBatchSimple( address to, uint256[] memory ids, uint256[] memory amounts ) internal virtual { for (uint256 i = 0; i < ids.length; ++i) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(_msgSender(), address(0), to, ids, amounts); } /** * @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 an {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; } }
// SPDX-License-Identifier: MIT // Based on OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; import "./SAN1155.sol"; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract SAN1155Burnable is SAN1155 { function burn(address account, uint256 id, uint256 value) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.20; abstract contract SANMetadata { uint256[157] internal sanFactions = [ 8172118231391141287902840013113466638914952054539639771171260499640339993648, 29430496281837262956462947599698477680114015847728529588968404981256659936273, 25393357345252657687578348685524716277208190960890993650346451664004748415256, 29633808514264345144814183736505347293089797980234916103205276024459315196450, 30997794508970546932695339362737748626051520564294775271332235480990298149908, 11088851274543046612534596707831127883620304102107090617791341461734175281432, 8177327568511719525707267028046949619428579739711613370657212349738512499784, 15947811451703475418972253741887238191481624435199846522869281518231147856945, 7732193023099147176953953278980406430491563238064738280913434807607180661825, 9279612382574686681127402412493149950275823556413062368439613207619681993091, 22658516974125200663226834582367883215142918725578025433782700808299578135570, 8206179891065982827427272001249707722201712208641054826683030142483053420835, 7922661334880222342750658733499771493946070122641381176098344693785380001812, 59936872091004013524380705450449207157309738970033980571097119443151256555907, 59763727181727881726613243756862669986082819893133680704279900791580211118372, 16313423641394527132297668070425006155613871900757179163005487788583621370920, 32807710136091177259795693570944504261451327778937887755711694487830293202049, 11086090568948432251399591338827340045964156117020709285395413555789900821521, 32694677702357318909697182374101968047166310143660976387555175633629225423891, 59741537974660048614959151045796085506410578882840771801801223085464541729042, 30420697163066095140688690768034017312874453646077987860331771285596214018337, 59317501176545182987983055501064816389561841843570449424820562612165178564930, 18128080585176152444226794394735506793010239035707070698456805004017219474466, 59820369748313283159604229631108345940410280779207928885706028620957823275521, 9105032894229945979105849675996708476204746294421801896081683924030073348370, 7724773588395726504537392581594837412617259706143598140956725063426284720776, 9081712998843592744859719028837281468254819189086029483406152032589141133377, 7719480896013179689619835903790787133686105740596302572778228651474042496017, 29628424614224332540965429694860414685338676695152231766033395904753520097298, 54511214746616474442643623328358672632929331478507643079965251961821340373640, 22234453054840859553098624345198537305934422425002756478823506271941147509267, 29520819839049765751463059447351288650979519592335532661942191210406976176420, 32681867548114573527903866670953285211493413185659946403004534634388373186632, 61550798859513052226319193038385183550975087594270352771153016437819051153474, 15381343686555675198625837724496474335967578587758905414302559721898038010132, 9135069567159577094657816353681206751158404281086690641252458890717686929537, 9081871737332460493573653020044347955401455119847851222293132688375540757272, 61550002222680535540868527270329878311101564686932243461766571283725338034979, 7776011754646192775870497704013965991376921292084685393843908121745900577923, 14956481243320019057128777023884867582768003464929639005082027454609225814305, 29460857037130715708472147241790461336840822459574758422587740808722246801537, 7804662192125122262488463525395677988217972393957152748229385215400958236737, 16345571975134151524723856104597707298006513969748379071222127886997191201809, 1930290801649354003037154680512703862422469877399048408699838160540681913409, 9161552479798262294808714797135922551717114425339838233718338657275939459394, 9163367650652110614221988545811969337436801931252679528384034495531713630529, 30878310101257591734203548147473781811890367630001158517376791124879226704148, 14968894461810922424526801024104035218241900763753304260242493607671296963617, 7781312295208728700266849707569993668990375088979278286567528264856480532514, 58831207122077829432536220416167288636416861121489561311154467846797017760840, 8629531363070578469553808093148346916113633350920319245295629738366675993122, 8184264015679463629736402535750205736372007151659699638958189898106081984836, 58384150388973897156342146629786450514179565642402337055143132869417973661988, 30086120942862244076439483773583852382575217475948796333584092944396241343524, 29515347613248869922164729238111959970930414451867583705273448198710947774754, 15861448982692692723094945921241832781274338385856927300603350689062250971970, 58915641364356307619610933434887006328905727001204775738328257909291242047506, 15439062559552472722262835875647857868931696304181565188403069953132124508436, 58578168589112190418306744769771666958929054071653652686521159429823599313288, 22651449666943389159509409546856775370255209959338661747655230479062751527971, 15053993410547815546402806987002554811281051729197611836865456433392468379665, 10885676359443946269573432145611928119760386413378449731493144620769641763348, 58379284745630218013772971135911998638054713042276733123832144651092255605025, 30081470261092880370672268486716293884403700016492353345477235669139595624737, 15414471178988014762412703782285721036568728475467899549995815774396217369394, 61635190852639421837480730153301989699953067529803927690300442917335623353473, 59381087423755638584105705821127647667242377751690498835763970266719601234241, 32597462216757577037690148587742963189226978300773147961076896020280702669076, 7760441468815460772416197749933621753223477978656511026143624144710656987713, 22647680391443324623972484993232894735679362650193453101335423707478540685587, 58832639665131307539182567387683123701722501623388796428834748103299496940163, 9161227342617692961930545348893115867939966098234397662221887383427943203880, 29436584053262656794074259411899676108226457392972874221666853586799215915592, 58919299378901958461615980459615630053215430822319726658496977311795323741202, 9077184600677909997355458142920276892031239216190153190934761701037369856836, 7922771752086562244729203399317346822523778506575454357856424035780865896996, 30877662808841169336788975123896264785049837300333434552708488579143763575108, 18320907613844533292751817027897276660470379544256007352663845968142972227857, 29458869519200677288635797635943928076874674925272773781010981736119685908612, 7816700541295837429166699168715118405651409126702046530381457977260871061793, 8172117642971865382509551405586076598352517867362645145788848291509985350020, 30884607582636238376688159537160509304780893845202319993972721250883615605800, 15947686785944546719126033119591537898259928997172150328413734892491378861186, 29432257111843840413687835110230446472769802505800917752116821178610230576259, 58463651632201661056879485098512105112808060433249410096150653852887898227730, 9133219926421052347829775587718240732621081384348791434033732748748164121154, 14986514605368367630291343514865814426723169944001884025978078478769573888328, 482815177440433400996510302924393273760071340059003585637486742121610314056, 18184508400905165243301468164704948518441919840393895691552928340118211930177, 7919285167096682777950670241738823581537981936347043761782765672151624270913, 9076542808796807190701330266157019447791005655554515664774253695187794625554, 11089181279244625167290053576865012756806028323784489085910951524519560417672, 29430602807404152826132512338038980005611524257525931141525286363670086174754, 58378511850967688060214862156809051706389268801674103609534274573460433307668, 15409170638522879074807689126316470651451916816635672889374718809718937190673, 7919126765520006992943528651317569738154716863411979750993340672372268671880, 8212549798498744969233131531737736323503099404474953908075346663859304874627, 30800175448038888869657646541091517237949490798475613948378233743061441202225, 9104951177532444608725890968358270005567297754048593832611298965239231689860, 29882913256535250203919092446015988626467535585540679822518815837706581586241, 10916044048693906167811694920408005573788761400169615202936077671163041485860, 29432256287670589846708071460951565705925576448437653848610899542031209890836, 59832647697530342123789279541362402494717011505218214655869355735021545079588, 8177092993497141878753483302460864944297130675028783581747737501834517419076, 25360028719254451686922070844937595710971837034614379859117178333859680625681, 58832716905629090012195868554020235741295226377871085382873782022547202904337, 59820593246436527130453319037056164810099783636570531345200427056839272960577, 9110143027612407915852016383999070166905443635773460386263721450519655490632, 29517887484865341834141870728567969144663309147287764638522578900795306575908, 7724884541087671635313643720744678003849405834964728681063716849751858287171, 16354077946152720651098549421202572709864074079658255062534725168023274132001, 32596728063821849205936785411072974252430948291212970494142995116040175960449, 14961897358113198031895445545500928056207096895267923620456645746377023045912, 7804620754703959264998146204200789105849810643720346027788960506044155529252, 30789194745696896284545943566893102130995184126838261909030091587651733979778, 7804329587912218274044180418544974872451058204566361903530580090573987844113, 9108373148950256516445128993655813529536562471291678514171507847612133049106, 7782092241325276821098579226724105734118240193667139527180479772775497875745, 59740971600079947932652969114684696832392884803266147373072289599426157363489, 32602090257247291584668853002254863775771923774410548599107217076355150790978, 30364178391888833056055093622011911355261467501799516041604220402618874341432, 52504091577161782951263159698826391888519489110675323940732900688282970689825, 58468974144010741211088368073001205522620743909184176389097654687386950570305, 58378851163755707925112702231548333772853514824967149444250921138712964335747, 15044821921567160847671994771529826739865863916742587353197246753838834197122, 61633820048253208237780679929353127804637823074835411164885089413827901202705, 30082566425334100739577578187700861008818009426030746145927348935517654844433, 29517197310632203257331820737207728388431425704929817372945201758670002853905, 22843793919025490602889118250176824869815824329767152936366203540161674379537, 7804662165064853769029125147403363242146447969830960339656245657144793318417, 7719480386079208864888593181814689760106277073416509806999618945210533446721, 23154808203569452641614975536642174799422931162952506746663755070477988664353, 9077184239739900229384440911828367453293098337174049617466251011156143642696, 7724884879147533867263510158513186707447765415668976955865282993571925082692, 8624450307431717967847067438041044117314276770575310198945215619729579910161, 11096251665219770268006938701094322433220939793517266342136515860347251425608, 18207594204644815656864056905318972256083864277784189705883631433169115826194, 7721399500515348348661107614326678699946111247309055324239508973234228905000, 15421980793673256746047779094971433572297843431398115302727707946075653478465, 22391702789909481066896063426322104521228219453666518491582627633227695735108, 7719589950563992452580558762830223631705120467838110517193998308157743698193, 16511656042692248558091511266205678535401041052836629397815776545433734105219, 15166734326800087547408575599610078473919221186706417353106760413502458892676, 9286901053021052224098792764795343822791182863527444981694086464759454270530, 16516626150716496050644186894939428304696816162704363971122239221952139039809, 18163526914763767899331791030754554122768168368131712130707894892794003818514, 15025385256384236496728937731960083631951853718428290655414189941119032300561, 59945725737492287429430450583399234769023828036754090083405292230104584360257, 9076418494696298363416961832233152239097257296837549280690229793870547747972, 58380630687368839487974706061173643230902433212080218288050159251844222779672, 30093078214590859114762106918046306738439385700409745255103886459112651952712, 8201828847250426851529542860056357012140382567961574638609781982361597253704, 32596791009940788336351669824869748939752665749581006758247781131787358507283, 59820590157961876402325001349477133615477905733350932598294127284781752533795, 32625724888840686694879571288271770915486989677524507531858137882822428596248, 30990622720003927274502257421688706802332158329987730486666196895749675159844, 46270568071285715492 ]; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface SANSoulbindable { enum SoulboundLevel { Unbound, One, Two, Three, Four } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./ERC2981Base.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 /// @dev This implementation has the same royalties for each and every tokens abstract contract ERC2981ContractWideRoyalties is ERC2981Base { RoyaltyInfo private _royalties; /// @dev Sets token royalties /// @param _recipient recipient of the royalties /// @param _value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setRoyalties( address _recipient, uint256 _value ) internal { // unneeded since the derived contract has a lower _value limit // require(_value <= 10000, "ERC2981Royalties: Too high"); _royalties = RoyaltyInfo(_recipient, uint24(_value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo( uint256, uint256 _value ) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties; receiver = royalties.recipient; royaltyAmount = (_value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @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 _value - 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 value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.12; interface IStuckERC20 { function transfer( address to, uint256 amount ) external returns (bool); } interface IStuckERC721 { function safeTransferFrom( address from, address to, uint256 tokenId ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IStuckTokens.sol"; import "@openzeppelin/contracts/utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IStuckERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IStuckERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./IStuckTokens.sol"; import "./SafeERC20.sol"; import "../utils/Ownable.sol"; error ArrayLengthMismatch(); contract TokenRescuer is Ownable { using SafeERC20 for IStuckERC20; function rescueBatchERC20( address _token, address[] calldata _receivers, uint256[] calldata _amounts ) external onlyOwner { if (_receivers.length != _amounts.length) revert ArrayLengthMismatch(); unchecked { for (uint i; i < _receivers.length; i += 1) { _rescueERC20(_token, _receivers[i], _amounts[i]); } } } function rescueERC20( address _token, address _receiver, uint256 _amount ) external onlyOwner { _rescueERC20(_token, _receiver, _amount); } function rescueBatchERC721( address _token, address[] calldata _receivers, uint256[][] calldata _tokenIDs ) external onlyOwner { if (_receivers.length != _tokenIDs.length) revert ArrayLengthMismatch(); unchecked { for (uint i; i < _receivers.length; i += 1) { uint256[] memory tokenIDs = _tokenIDs[i]; for (uint j; j < tokenIDs.length; j += 1) { _rescueERC721(_token, _receivers[i], tokenIDs[j]); } } } } function rescueERC721( address _token, address _receiver, uint256 _tokenID ) external onlyOwner { _rescueERC721(_token, _receiver, _tokenID); } function _rescueERC20( address _token, address _receiver, uint256 _amount ) private { IStuckERC20(_token).safeTransfer(_receiver, _amount); } function _rescueERC721( address _token, address _receiver, uint256 _tokenID ) private { IStuckERC721(_token).safeTransferFrom( address(this), _receiver, _tokenID ); } }
// SPDX-License-Identifier: MIT // Based on OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) // With renounceOwnership() removed pragma solidity ^0.8.12; import "@openzeppelin/contracts/utils/Context.sol"; /** * @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 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); } }
{ "optimizer": { "enabled": true, "runs": 33333 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_royaltiesReceiver","type":"address"},{"internalType":"uint256","name":"_royaltiesPercent","type":"uint256"},{"internalType":"address","name":"_sanContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"ExceedsMaxRoyaltiesPercentage","type":"error"},{"inputs":[],"name":"SaleStateNotActive","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sacrificer","type":"address"}],"name":"Sacrifice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum ISANPASS.SaleState","name":"newSaleState","type":"uint8"}],"name":"SaleStateChanged","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":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROYALTIES_PCT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAN","outputs":[{"internalType":"contract ISAN","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_takeThisEngineerMayItServeYouWell","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdropRedvoxx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdropVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"rescueBatchERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[][]","name":"_tokenIDs","type":"uint256[][]"}],"name":"rescueBatchERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_value","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":[],"name":"saleState","outputs":[{"internalType":"enum ISANPASS.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sanTokenId","type":"uint256"}],"name":"sanTokenFactions","outputs":[{"internalType":"uint256","name":"factions_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ISANPASS.SaleState","name":"_newSaleState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userFactionCredits","outputs":[{"internalType":"uint8","name":"chi","type":"uint8"},{"internalType":"uint8","name":"umi","type":"uint8"},{"internalType":"uint8","name":"sora","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"none","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6114406040527f121141481488888112418112282441211421128214432134128444141141143060a09081527f411112124384814818131344231838184121214138848482421213182288241160c0527f382421848422412183111244111181128421242441124114414148148144111860e0527f4184242818121412111812121412142144841811411411421231812148413222610100527f4488214481122814218481212111818122442214111812408324411422241414610120527f1884114184141142113841414234422822424243244322411281131831841118610140527f1214341122128142281321121111114144848141814824214182114244134448610160527f2342243344411814188281114114418411112111118344414114814344114431610180527f11184423322114111811418181111442884182241422148821211814284814416101a0527f14841311412122818212448132811412814214121884288118414281213141836101c0527f32184421424111248411884881383428411181821411244222114142211814126101e0527f1224888141824112312442248224441422118141411382818141318281182123610200527f1184114188112112348214421348441884221411282312114424482311241814610220527f8483114221118114111814344118412122831111118111123224241481441183610240527f8421122481341421141812441181148111112111142414411414113281218124610260527f2411121118242824284444212442322281411484881821828114114184122428610280527f48888182448113444484314441112414241211438181223824414428811144816102a0527f18828141411421118112181812128224182828184244344834444111244434116102c0527f48488824488428818244111318211141248444118118211211441448124414136102e0527f8414832112442124218428822442124481128012244821242311111242141112610300527f4341812241231421811111121812144821448414421421323111241821824121610320527f8324841213124434444888121212424414124142114182181182112422182142610340527f2814214811221244112841184111844411488312114111111841181221811422610360527f8441212211824224211112811111181113181181213122482212822241181201610380527f14214418228828414121211121112384822281248181442144321143118421126103a0527f11141121114484114428444411181421224123184144243224431841424412886103c0527f14141141241114483411811141881244481411484812481138814844838248416103e0527f1111124432311341821121381114223181123811114811811421112111142411610400527f4181181424811881882841118882411481421148238111841448181114183812610420527f7884411232284481124381413284144411818428421181112318211314481288610440527f3128412448284444318214412442428483824111842111188148182441144213610460527f4144312134112243411411111418412411148223424812888114818412444124610480527f48414811411214484841148114213112144424181111311481141211412128486104a0527f88148481182422144181214424421228448821144244414443123441141118426104c0527f22018832148112488321114181111282444148123283414121828211214821146104e0527f1432442241314184111841134444312418812212241211884241883281841881610500527f1414284114244124222114424221181142123844221144818421824111223318610520527f8814111431211441488212211128233123243821418888111813244231144323610540527f1131111248114424211442422411282844823821111418121312114484222483610560527f2111118234218842212814881411281121318244112111111211231814821121610580527f41224111443811484281884114883418141322111141181813184181141418816105a0527f11414842121822818124218121121241113348411114111412413224181418416105c0527f24234411111442482218811122141232324331011148112221284211411114116105e0527f0444818124141411431488281182812841412444843241812121422211244441610600527f1441414414421182141818124214244411114241144121118421182321111142610620527f1442484482122824848114114412131414411124124241282221884241211141610640527f4444811181121118481431241418243421141241221281112112223111481114610660527f2118181211411844341214181241473188418181441211818214211481183421610680527f11341112421172841381111182841423212111888422111114218211111448226106a0527f82114881188432448241281441114414121181111281822113121112411444486106c0527f13142444183211481118481811318114121413111248442883431824118442226106e0527f1218211842118814341241211228424888811442183112142122121112814144610700527f8114421141214421221148281132421441128114312141482481141132114124610720527f4284241884123441221811828842114218488111224418481411422288141424610740527f4141184111412232281423841148248448842242111441441412284412188122610760527f2311431141124111121411111148114214111121182812214444832441218342610780527f82411241342232283211121141234241138411248111111181223888112148126107a0527f22223322114112128248241321841811221811181248412121212231242111146107c0527f81821188447418181211113414133122414414181141421341841124418181886107e0527f3214442444211211221484122122441148242448138812184184112132344423610800527f2148422182141111214248141414483148181244118844811121181834184811610820527f1811131111841114141121848111428422112121114114114111838221181214610840527f8111811483222243141411438824481421418142881441841341231183248121610860527f4281824124442231111314841418432114422441211811112821432242128121610880527f22144811112482211483421842144134284441448448141422844144213123326108a0527f88444822181281224141412281844414818444144822314138421314822144816108c0527f83488123112828431211248412424427244814211111284441111142242311416108e0527f4811828183112428448122141281441482211222411883124181128412241114610900527f1128411448241121282422111123181441488128441428184421832333421241610920527f3212220211441123111121141221814111441142881114232184882121141113610940527f8212181112212114144214442112884414248144124311281412228841181283610960527f1441122812222124811423238413118114141181182122421881441322338428610980527f41148422418214844814144111484224114144842811241114811813148232486109a0527f82432444811118811812412844841111144121281821421811248442121224126109c0527f14118121848134124122414181211421411114111442422421188384281213446109e0527f1184214122214844483181288412824111184112214134242318184214113224610a00527f4444234818144112421121311122811281841481148411824411448138414144610a20527f2881442813113881182142431888481822118412113181122441414144241111610a40527f4121211821118414138141424211212842241148812842841224181442148884610a60527f1148188142312141314141221143214118243141212484111818111812811121610a80527f1211413241288221244281442812122231421431828412124223841414181184610aa0527f4448118412211181488823814411114412122181112128132138418181284428610ac0527f2342122328184422182424212181434311111114111444828148121188112482610ae0527f4112113314224211141311311841811412284112211838141481414124414483610b00527f8141411242124111423884184822122422232482143281414844411411218412610b20527f1431382344412221212821212421144331411211141184282241481882134242610b40527f2122111184181113214111811422312181411414838818411421141184848148610b60527f0111438242111182828142181421813184124113148471112414214812418148610b80527f2834112814221841284241438222443414222322113118118118444221442841610ba0527f1182281482284224218412841118114442241811221442314232121484114441610bc0527f1411242422381112122111114281438412121441381814228114422818118412610be0527f1884411212142231818148811121481882482228424414414888824811111188610c00527f4111218184413121211811288844141881411382142311211142181211444822610c20527f8111111841814423882242211121424141181443248121848142124222188814610c40527f2211481118111812121441424242221188811142448112412411823844118111610c60527f1182112111414112212888124111822141123812814241481422441324812388610c80527f1228237241122113842242141411123814111821811183111488414211214283610ca0527f4418481224241414442114182131111181214811211341822113484181124831610cc0527f1421384118184384311811884314411881411182414411431211428111443484610ce0527f4211212884181281218414281244121134842441121218111143111188423141610d00527f1822431144123114221218828448243188814811124818411412141181411424610d20527f4112111482241114143234421123212884118482211314142411221822148414610d40527f8448141884141242448121424814414184411133311142444811121241304324610d60527f1214121443214123834113841422242112282432888142234424811214881444610d80527f3811448112184188418211211241441111432314111111113121242124442411610da0527f8212234214824212444144418211811411181141443123412448342118241111610dc0527f8441418413144231844141144410113112444122381241211424843112841241610de0527f1424288184414124344824134411181482121811412441224842122814122448610e00527f4142884224411141114148414811314288848114488818222321212241188824610e20527f1114213488121181212414214322828882318323214122118442214282131243610e40527f2428148111212242422311422281324341412422128214134481111222121221610e60527f4811182244214811141288282428113482314141812414142418144181334181610e80527f2114224111118482122181181111418448444411411184824141821122144118610ea0527f1141424112412141814414481212214821412811414812814841141113318824610ec0527f4412111141281188112244118218228412411824444224218422317118428282610ee0527f1141181118421441814124114118241822141811111242181281281284811011610f00527f1423281111844448221281218218148411421428314814112413828414448312610f20527f1134821411418142181211881841412841111842442241222118228441244121610f40527f8414311112124144841142121412121211228121443438114412118481844121610f60527f4814211113113184111882281113242141211411348841211811111211124142610f80527f4321841484842824184214881713184148142848181482181824422111222838610fa0527f7414434224842244128228221114111242124821214212211141321418431121610fc0527f8144444131883348244111421124114444444112414124824488142418221141610fe0527f8111424211121244412824131121211818242214884113818181882811418883611000527f2143114413221223111821211111442243442441221112412321124284412282611020527f8843818422282481142181111112134418114422121123121144831218432111611040527f4282211422144222424211144214418222822848221444441112448241118411611060527f4142244228112882111444812181141441142111424414441214284421841811611080527f32812111184843444842183141888243111144411214112823244141141881116110a0527f11414841112444148114412118112441141143488841818141447418121144116110c0527f11111231481442244144488211121212422131124241411124134121414284416110e0527f3331283211118814141328281111141448111113114812114182142421221421611100527f1411811421318128182811121132141114141311812411431424122111421848611120527f1114214112241241281111111118181148848431111114212811884888144244611140527f1311441144282424134224244348488188248143112114113821414212112411611160527f1888418143182481141228414148214441484211411418823112448118818148611180527f28412214218223184414348244273412443441143428441311444111421848126111a0527f11122841313828212114244324441818112211234414341483482428224144286111c0527f22188824282181412842114138148481812311218111441248241121383118416111e0527f3181413120811121188131418184412211484418833112141382312182414144611200527f1111221141112211134441243212123148311111488482122124831418341111611220527f2481442184118244112211814448442824288111411234411211124284284883611240527f2188114282122448412821424144428141242111111224142238441813811184611260527f1488332111212148318881481213414143113181312244124881224211148442611280527f24841441118431818112488111218183411831112422114441144848114114416112a0527f28283121811221818118321211881124114842812118222111248142111388126112c0527f21381112182311242121121348841441338144118188118121141284114114116112e0527f8488141221184418144814182181111131481441414144211141284141811141611300527f1411122111418112211113311111181143112281211834244841282441178484611320527f8112441844182181114141844482321111212218184884241818811124418118611340527f4288142411188888428811321118141121011141844288112831111811231248611360527f1222121412318443824344281184844414483811442218114842884441441848611380527f48112141114448181214128248448212414844184214122181843414118111136113a0527f84414111844244844184213318121418811831414421141484122824844443236113c0527f48218182488221414118114118181842241441121823248881112884118418186113e0527f4484122411148111814314481244211214414211411443342132811211141124611400526802822214824484322461142052620016ae90600590609d6200292f565b5060405180610ee001604052806040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503130323031360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503131323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503131313131360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503130323031360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503131303131360d41b81525081526020016040518060400160405280600681526020016503131313131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503232313031360d41b81525081525060a59060776200278792919062002972565b5034801562002794575f80fd5b506040516200735838038062007358833981016040819052620027b79162002b0d565b83620027c38162002801565b50620027cf3362002813565b60a2620027dd868262002c2c565b50620027ea838362002864565b6001600160a01b03166080525062002cf492505050565b60026200280f828262002c2c565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6004546001600160a01b03163314620028c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b61014d811115620028e7576040516303e231b960e01b815260040160405180910390fd5b604080518082019091526001600160a01b03831680825262ffffff83166020909201829052600380546001600160b81b031916909117600160a01b9092029190911790555050565b82609d810192821562002960579160200282015b828111156200296057825182559160200191906001019062002943565b506200296e929150620029be565b5090565b8260778101928215620029b0579160200282015b82811115620029b057825182906200299f908262002c2c565b509160200191906001019062002986565b506200296e929150620029d4565b5b808211156200296e575f8155600101620029bf565b808211156200296e575f620029ea8282620029f4565b50600101620029d4565b50805462002a029062002ba0565b5f825580601f1062002a12575050565b601f0160209004905f5260205f209081019062002a309190620029be565b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262002a57575f80fd5b81516001600160401b038082111562002a745762002a7462002a33565b604051601f8301601f19908116603f0116810190828211818310171562002a9f5762002a9f62002a33565b8160405283815260209250868385880101111562002abb575f80fd5b5f91505b8382101562002ade578582018301518183018401529082019062002abf565b5f93810190920192909252949350505050565b80516001600160a01b038116811462002b08575f80fd5b919050565b5f805f805f60a0868803121562002b22575f80fd5b85516001600160401b038082111562002b39575f80fd5b62002b4789838a0162002a47565b9650602088015191508082111562002b5d575f80fd5b5062002b6c8882890162002a47565b94505062002b7d6040870162002af1565b92506060860151915062002b946080870162002af1565b90509295509295909350565b600181811c9082168062002bb557607f821691505b60208210810362002bd457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562002c27575f81815260208120601f850160051c8101602086101562002c025750805b601f850160051c820191505b8181101562002c235782815560010162002c0e565b5050505b505050565b81516001600160401b0381111562002c485762002c4862002a33565b62002c608162002c59845462002ba0565b8462002bda565b602080601f83116001811462002c96575f841562002c7e5750858301515b5f19600386901b1c1916600185901b17855562002c23565b5f85815260208120601f198616915b8281101562002cc65788860151825594840194600190910190840162002ca5565b508582101562002ce457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805161464462002d145f395f81816102cb0152610fa101526146445ff3fe608060405234801561000f575f80fd5b50600436106101e6575f3560e01c80637312808b11610109578063e8a3d4851161009e578063f242432a1161006e578063f242432a1461053f578063f2fde38b14610552578063f5298aca14610565578063fccc281314610578575f80fd5b8063e8a3d485146104d3578063e985e9c5146104db578063ede9dddd14610523578063f02678e91461052c575f80fd5b8063938e3d7b116100d9578063938e3d7b14610487578063a19b6ea11461049a578063a22cb465146104ad578063b2118a8d146104c0575f80fd5b80637312808b146104305780637df325e1146104435780638c7ea24b146104565780638da5cb5b14610469575f80fd5b806319f297b71161017f5780635a67de071161014f5780635a67de07146103dd578063603f4d52146103f05780636b20c4541461040a57806372e017121461041d575f80fd5b806319f297b7146103585780632a55205a1461036b5780632eb2c2d6146103aa5780634e1273f4146103bd575f80fd5b80630c2ab324116101ba5780630c2ab324146102c65780630e89341c146103125780631558c155146103325780631746114814610345575f80fd5b8062fdd58e146101ea57806301ffc9a71461021057806302fe5305146102335780630a835c9214610248575b5f80fd5b6101fd6101f83660046136d3565b610581565b6040519081526020015b60405180910390f35b61022361021e366004613728565b61065f565b6040519015158152602001610207565b61024661024136600461374a565b610669565b005b6102926102563660046137b6565b60a46020525f908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610207565b6102ed7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610207565b6103256103203660046137cf565b61072c565b6040516102079190613851565b6102466103403660046138ab565b6107be565b610246610353366004613912565b6108dc565b6102466103663660046138ab565b61106c565b61037e610379366004613951565b611169565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610207565b6102466103b8366004613b08565b6111db565b6103d06103cb366004613bab565b61129d565b6040516102079190613c9f565b6102466103eb366004613cb1565b6113f3565b60a3546103fd9060ff1681565b6040516102079190613cfc565b610246610418366004613d3b565b6114ef565b6101fd61042b3660046137cf565b6115b4565b61024661043e366004613daa565b6115e9565b610246610451366004613e25565b611706565b6102466104643660046136d3565b611792565b60045473ffffffffffffffffffffffffffffffffffffffff166102ed565b61024661049536600461374a565b6118cd565b6103256104a83660046137cf565b61195b565b6102466104bb366004613e6b565b6119f8565b6102466104ce366004613e25565b611a03565b610325611a8f565b6102236104e9366004613ea0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6101fd61014d81565b61024661053a366004613daa565b611a9c565b61024661054d366004613ed1565b611c1d565b6102466105603660046137b6565b611cdf565b610246610573366004613f31565b611e0f565b6102ed61dead81565b5f73ffffffffffffffffffffffffffffffffffffffff831661062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b505f8181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b5f61065982611ecf565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61072882828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f2492505050565b5050565b60606002805461073b90613f61565b80601f016020809104026020016040519081016040528092919081815260200182805461076790613f61565b80156107b25780601f10610789576101008083540402835291602001916107b2565b820191905f5260205f20905b81548152906001019060200180831161079557829003601f168201915b50505050509050919050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114610878576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d5576108cd85858381811061089757610897613fb2565b90506020020160208101906108ac91906137b6565b60065b8585858181106108c1576108c1613fb2565b90506020020135611f30565b60010161087a565b5050505050565b600160a35460ff1660018111156108f5576108f5613ccf565b1461092c576040517fd2ab239f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260a460209081526040808320815160a081018352905460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204831660608201526401000000009091049091166080820152905b82811015610a3b575f6109b68585848181106109aa576109aa613fb2565b905060200201356115b4565b9050805f036109d25760808301805160010160ff169052610a32565b60088116156109ee5760608301805160010160ff169052610a32565b6001811615610a0257825160010160ff1683525b6002811615610a1a5760208301805160010160ff1690525b6004811615610a325760408301805160010160ff1690525b5060010161098c565b5080516020820151604083015160608401516080850151600360ff95861681900486169594851681900485169493841681900484169392831681900483169291821604165f8115610a8d576001610a8f565b5f5b8315610a9c576001610a9e565b5f5b8515610aab576001610aad565b5f5b8715610aba576001610abc565b5f5b8915610ac9576001610acb565b5f5b0101010160ff16905080600103610bd7578515610b0157610aee33600188611f30565b865160039060ff160660ff168752610e7f565b8415610b3857610b1333600287611f30565b6003876020015160ff1681610b2a57610b2a613fdf565b0660ff166020880152610e7f565b8315610b6f57610b4a33600386611f30565b6003876040015160ff1681610b6157610b61613fdf565b0660ff166040880152610e7f565b8215610ba657610b8133600485611f30565b6003876060015160ff1681610b9857610b98613fdf565b0660ff166060880152610e7f565b610bb233600584611f30565b6003876080015160ff1681610bc957610bc9613fdf565b0660ff166080880152610e7f565b8060011015610e7f575f8167ffffffffffffffff811115610bfa57610bfa613971565b604051908082528060200260200182016040528015610c23578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c4057610c40613971565b604051908082528060200260200182016040528015610c69578160200160208202803683370190505b5090505f8815610cc6576001838281518110610c8757610c87613fb2565b60200260200101818152505088828280600101935081518110610cac57610cac613fb2565b6020908102919091010152895160039060ff160660ff168a525b8715610d32576002838281518110610ce057610ce0613fb2565b60200260200101818152505087828280600101935081518110610d0557610d05613fb2565b60200260200101818152505060038a6020015160ff1681610d2857610d28613fdf565b0660ff1660208b01525b8615610d9e576003838281518110610d4c57610d4c613fb2565b60200260200101818152505086828280600101935081518110610d7157610d71613fb2565b60200260200101818152505060038a6040015160ff1681610d9457610d94613fdf565b0660ff1660408b01525b8515610e0a576004838281518110610db857610db8613fb2565b60200260200101818152505085828280600101935081518110610ddd57610ddd613fb2565b60200260200101818152505060038a6060015160ff1681610e0057610e00613fdf565b0660ff1660608b01525b8415610e70576005838281518110610e2457610e24613fb2565b60200260200101818152505084828281518110610e4357610e43613fb2565b60200260200101818152505060038a6080015160ff1681610e6657610e66613fdf565b0660ff1660808b01525b610e7b338484611fcc565b5050505b5050505050508060a45f610e903390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182015f20845181549486015193860151606087015160809097015160ff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9882166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9383166201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff978316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909916929094169190911796909617949094161792909217939093169190911790557f00000000000000000000000000000000000000000000000000000000000000001663f3993d11610fcd3390565b61dead86866040518563ffffffff1660e01b8152600401610ff1949392919061400c565b5f604051808303815f87803b158015611008575f80fd5b505af115801561101a573d5f803e3d5ffd5b505050506110253390565b73ffffffffffffffffffffffffffffffffffffffff167fbcdecc1a9f4b8ca5f0e29df5f18f1c855d85216b93dbcab280c0978ff1a103d060405160405180910390a2505050565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611126576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d55761116185858381811061114557611145613fb2565b905060200201602081019061115a91906137b6565b60076108af565b600101611128565b6040805180820190915260035473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910462ffffff166020830181905290915f91612710906111c790866140b1565b6111d191906140c8565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8516331480611204575061120485336104e9565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d585858585856120da565b60608151835114611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610621565b5f835167ffffffffffffffff81111561134b5761134b613971565b604051908082528060200260200182016040528015611374578160200160208202803683370190505b5090505f5b84518110156113eb576113be85828151811061139757611397613fb2565b60200260200101518583815181106113b1576113b1613fb2565b6020026020010151610581565b8282815181106113d0576113d0613fb2565b60209081029190910101526113e481614100565b9050611379565b509392505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a380548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183818111156114b0576114b0613ccf565b02179055507f92a17b827ee9d42ea9454bb4ca941a1800870e6d01c0842d09ba23ccc0190ee1816040516114e49190613cfc565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8316331480611518575061151883336104e9565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612407565b505050565b5f600682901c6115c8603f841660046140b1565b600582609d81106115db576115db613fb2565b0154600f911c169392505050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b8281146116a3576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe576116f6868686848181106116c3576116c3613fb2565b90506020020160208101906116d891906137b6565b8585858181106116ea576116ea613fb2565b90506020020135612728565b6001016116a5565b505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612749565b60045473ffffffffffffffffffffffffffffffffffffffff163314611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61014d81111561184f576040517f03e231b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831680825262ffffff83166020909201829052600380547fffffffffffffffffff000000000000000000000000000000000000000000000016909117740100000000000000000000000000000000000000009092029190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a26115af82848361417c565b60a5816077811061196a575f80fd5b01805490915061197990613f61565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613f61565b80156119f05780601f106119c7576101008083540402835291602001916119f0565b820191905f5260205f20905b8154815290600101906020018083116119d357829003601f168201915b505050505081565b6107283383836127d7565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612728565b60a2805461197990613f61565b60045473ffffffffffffffffffffffffffffffffffffffff163314611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611b56576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe575f838383818110611b7357611b73613fb2565b9050602002810190611b859190614293565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509394505050505b8151811015611c1357611c0b88888886818110611bd757611bd7613fb2565b9050602002016020810190611bec91906137b6565b848481518110611bfe57611bfe613fb2565b6020026020010151612749565b600101611bb8565b5050600101611b58565b73ffffffffffffffffffffffffffffffffffffffff8516331480611c465750611c4685336104e9565b611cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d58585858585612929565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b73ffffffffffffffffffffffffffffffffffffffff8116611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610621565b611e0c81612b63565b50565b73ffffffffffffffffffffffffffffffffffffffff8316331480611e385750611e3883336104e9565b611ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612bd9565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610659575061065982612dde565b600261072882826142f7565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054839290611f6c90849061440f565b9091555050604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516915f9133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b5f5b825181101561207957818181518110611fe957611fe9613fb2565b60200260200101515f8085848151811061200557612005613fb2565b602002602001015181526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612063919061440f565b90915550612072905081614100565b9050611fce565b5073ffffffffffffffffffffffffffffffffffffffff83165f3373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8585604051611fbf929190614422565b815183511461216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff841661220e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f5b845181101561237a575f85828151811061222d5761222d613fb2565b602002602001015190505f85838151811061224a5761224a613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061235f90849061440f565b925050819055505050508061237390614100565b9050612211565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123f1929190614422565b60405180910390a46116fe818787878787612ec0565b73ffffffffffffffffffffffffffffffffffffffff83166124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b805182511461253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b60408051602081019091525f9081905233905b8351811015612695575f84828151811061256a5761256a613fb2565b602002602001015190505f84838151811061258757612587613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f9283526020838152604080852073ffffffffffffffffffffffffffffffffffffffff8b168652909152909220910390558061268d81614100565b91505061254e565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161270c929190614422565b60405180910390a460408051602081019091525f905250505050565b6115af73ffffffffffffffffffffffffffffffffffffffff84168383613149565b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906342842e0e906064015f604051808303815f87803b1580156127bc575f80fd5b505af11580156127ce573d5f803e3d5ffd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f6129d7856131d6565b90505f6129e3856131d6565b90505f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015612aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8781526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290612aeb90849061440f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b58848a8a8a8a8a61321f565b505050505050505050565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8316612c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b335f612c87846131d6565b90505f612c93846131d6565b60408051602080820183525f9182905288825281815282822073ffffffffffffffffffffffffffffffffffffffff8b1683529052205490915084811015612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90526127ce565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480612e7057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061065957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610659565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612f37908990899088908890889060040161444f565b6020604051808303815f875af1925050508015612f8f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f8c918101906144b9565b60015b61307857612f9b6144d4565b806308c379a003612fee5750612faf6144ed565b80612fba5750612ff0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106219190613851565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610621565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115af9084906133cb565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061320e5761320e613fb2565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906132969089908990889088908890600401614594565b6020604051808303815f875af19250505080156132ee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526132eb918101906144b9565b60015b6132fa57612f9b6144d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b5f61342c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134d69092919063ffffffff16565b8051909150156115af578080602001905181019061344a91906145d8565b6115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610621565b60606134e484845f856134ec565b949350505050565b60608247101561357e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610621565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516135a691906145f3565b5f6040518083038185875af1925050503d805f81146135e0576040519150601f19603f3d011682016040523d82523d5f602084013e6135e5565b606091505b50915091506135f687838387613601565b979650505050505050565b606083156136965782515f0361368f5773ffffffffffffffffffffffffffffffffffffffff85163b61368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610621565b50816134e4565b6134e48383815115612fba5781518083602001fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146136ce575f80fd5b919050565b5f80604083850312156136e4575f80fd5b6136ed836136ab565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e0c575f80fd5b5f60208284031215613738575f80fd5b8135613743816136fb565b9392505050565b5f806020838503121561375b575f80fd5b823567ffffffffffffffff80821115613772575f80fd5b818501915085601f830112613785575f80fd5b813581811115613793575f80fd5b8660208285010111156137a4575f80fd5b60209290920196919550909350505050565b5f602082840312156137c6575f80fd5b613743826136ab565b5f602082840312156137df575f80fd5b5035919050565b5f5b838110156138005781810151838201526020016137e8565b50505f910152565b5f815180845261381f8160208601602086016137e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6137436020830184613808565b5f8083601f840112613873575f80fd5b50813567ffffffffffffffff81111561388a575f80fd5b6020830191508360208260051b85010111156138a4575f80fd5b9250929050565b5f805f80604085870312156138be575f80fd5b843567ffffffffffffffff808211156138d5575f80fd5b6138e188838901613863565b909650945060208701359150808211156138f9575f80fd5b5061390687828801613863565b95989497509550505050565b5f8060208385031215613923575f80fd5b823567ffffffffffffffff811115613939575f80fd5b61394585828601613863565b90969095509350505050565b5f8060408385031215613962575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156139e2576139e2613971565b6040525050565b5f67ffffffffffffffff821115613a0257613a02613971565b5060051b60200190565b5f82601f830112613a1b575f80fd5b81356020613a28826139e9565b604051613a35828261399e565b83815260059390931b8501820192828101915086841115613a54575f80fd5b8286015b84811015613a6f5780358352918301918301613a58565b509695505050505050565b5f82601f830112613a89575f80fd5b813567ffffffffffffffff811115613aa357613aa3613971565b604051613ad860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018261399e565b818152846020838601011115613aec575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b1c575f80fd5b613b25866136ab565b9450613b33602087016136ab565b9350604086013567ffffffffffffffff80821115613b4f575f80fd5b613b5b89838a01613a0c565b94506060880135915080821115613b70575f80fd5b613b7c89838a01613a0c565b93506080880135915080821115613b91575f80fd5b50613b9e88828901613a7a565b9150509295509295909350565b5f8060408385031215613bbc575f80fd5b823567ffffffffffffffff80821115613bd3575f80fd5b818501915085601f830112613be6575f80fd5b81356020613bf3826139e9565b604051613c00828261399e565b83815260059390931b8501820192828101915089841115613c1f575f80fd5b948201945b83861015613c4457613c35866136ab565b82529482019490820190613c24565b96505086013592505080821115613c59575f80fd5b506111d185828601613a0c565b5f8151808452602080850194508084015f5b83811015613c9457815187529582019590820190600101613c78565b509495945050505050565b602081525f6137436020830184613c66565b5f60208284031215613cc1575f80fd5b813560028110613743575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160028310613d35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f805f60608486031215613d4d575f80fd5b613d56846136ab565b9250602084013567ffffffffffffffff80821115613d72575f80fd5b613d7e87838801613a0c565b93506040860135915080821115613d93575f80fd5b50613da086828701613a0c565b9150509250925092565b5f805f805f60608688031215613dbe575f80fd5b613dc7866136ab565b9450602086013567ffffffffffffffff80821115613de3575f80fd5b613def89838a01613863565b90965094506040880135915080821115613e07575f80fd5b50613e1488828901613863565b969995985093965092949392505050565b5f805f60608486031215613e37575f80fd5b613e40846136ab565b9250613e4e602085016136ab565b9150604084013590509250925092565b8015158114611e0c575f80fd5b5f8060408385031215613e7c575f80fd5b613e85836136ab565b91506020830135613e9581613e5e565b809150509250929050565b5f8060408385031215613eb1575f80fd5b613eba836136ab565b9150613ec8602084016136ab565b90509250929050565b5f805f805f60a08688031215613ee5575f80fd5b613eee866136ab565b9450613efc602087016136ab565b93506040860135925060608601359150608086013567ffffffffffffffff811115613f25575f80fd5b613b9e88828901613a7a565b5f805f60608486031215613f43575f80fd5b613f4c846136ab565b95602085013595506040909401359392505050565b600181811c90821680613f7557607f821691505b602082108103613fac577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614069575f80fd5b8260051b808560808501379190910160800195945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761065957610659614084565b5f826140fb577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361413057614130614084565b5060010190565b601f8211156115af575f81815260208120601f850160051c8101602086101561415d5750805b601f850160051c820191505b818110156116fe57828155600101614169565b67ffffffffffffffff83111561419457614194613971565b6141a8836141a28354613f61565b83614137565b5f601f8411600181146141f8575f85156141c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556108d5565b5f838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142465786850135825560209485019460019092019101614226565b5086821015614281577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142c6575f80fd5b83018035915067ffffffffffffffff8211156142e0575f80fd5b6020019150600581901b36038213156138a4575f80fd5b815167ffffffffffffffff81111561431157614311613971565b6143258161431f8454613f61565b84614137565b602080601f831160018114614377575f84156143415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556116fe565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143c3578886015182559484019460019091019084016143a4565b50858210156143ff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561065957610659614084565b604081525f6144346040830185613c66565b82810360208401526144468185613c66565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261448760a0830186613c66565b82810360608401526144998186613c66565b905082810360808401526144ad8185613808565b98975050505050505050565b5f602082840312156144c9575f80fd5b8151613743816136fb565b5f60033d11156144ea5760045f803e505f5160e01c5b90565b5f60443d10156144fa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561454857505050505090565b82850191508151818111156145605750505050505090565b843d870101602082850101111561457a5750505050505090565b6145896020828601018761399e565b509095945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526135f660a0830184613808565b5f602082840312156145e8575f80fd5b815161374381613e5e565b5f82516146048184602087016137e6565b919091019291505056fea2646970667358221220aa807317cf30e3556c177951e9174d894b769beb4ba6ae102a5d14a128cf84ab64736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f000000000000000000000000000000000000000000000000000000000000014d00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5061414c777472724e6e50785151484c72785a725453667a3836484c41764876327476786e6b337461414d450000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d594a484c336e324e684d3663787146727a43655558636844595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101e6575f3560e01c80637312808b11610109578063e8a3d4851161009e578063f242432a1161006e578063f242432a1461053f578063f2fde38b14610552578063f5298aca14610565578063fccc281314610578575f80fd5b8063e8a3d485146104d3578063e985e9c5146104db578063ede9dddd14610523578063f02678e91461052c575f80fd5b8063938e3d7b116100d9578063938e3d7b14610487578063a19b6ea11461049a578063a22cb465146104ad578063b2118a8d146104c0575f80fd5b80637312808b146104305780637df325e1146104435780638c7ea24b146104565780638da5cb5b14610469575f80fd5b806319f297b71161017f5780635a67de071161014f5780635a67de07146103dd578063603f4d52146103f05780636b20c4541461040a57806372e017121461041d575f80fd5b806319f297b7146103585780632a55205a1461036b5780632eb2c2d6146103aa5780634e1273f4146103bd575f80fd5b80630c2ab324116101ba5780630c2ab324146102c65780630e89341c146103125780631558c155146103325780631746114814610345575f80fd5b8062fdd58e146101ea57806301ffc9a71461021057806302fe5305146102335780630a835c9214610248575b5f80fd5b6101fd6101f83660046136d3565b610581565b6040519081526020015b60405180910390f35b61022361021e366004613728565b61065f565b6040519015158152602001610207565b61024661024136600461374a565b610669565b005b6102926102563660046137b6565b60a46020525f908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610207565b6102ed7f00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610207565b6103256103203660046137cf565b61072c565b6040516102079190613851565b6102466103403660046138ab565b6107be565b610246610353366004613912565b6108dc565b6102466103663660046138ab565b61106c565b61037e610379366004613951565b611169565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610207565b6102466103b8366004613b08565b6111db565b6103d06103cb366004613bab565b61129d565b6040516102079190613c9f565b6102466103eb366004613cb1565b6113f3565b60a3546103fd9060ff1681565b6040516102079190613cfc565b610246610418366004613d3b565b6114ef565b6101fd61042b3660046137cf565b6115b4565b61024661043e366004613daa565b6115e9565b610246610451366004613e25565b611706565b6102466104643660046136d3565b611792565b60045473ffffffffffffffffffffffffffffffffffffffff166102ed565b61024661049536600461374a565b6118cd565b6103256104a83660046137cf565b61195b565b6102466104bb366004613e6b565b6119f8565b6102466104ce366004613e25565b611a03565b610325611a8f565b6102236104e9366004613ea0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6101fd61014d81565b61024661053a366004613daa565b611a9c565b61024661054d366004613ed1565b611c1d565b6102466105603660046137b6565b611cdf565b610246610573366004613f31565b611e0f565b6102ed61dead81565b5f73ffffffffffffffffffffffffffffffffffffffff831661062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b505f8181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b5f61065982611ecf565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61072882828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f2492505050565b5050565b60606002805461073b90613f61565b80601f016020809104026020016040519081016040528092919081815260200182805461076790613f61565b80156107b25780601f10610789576101008083540402835291602001916107b2565b820191905f5260205f20905b81548152906001019060200180831161079557829003601f168201915b50505050509050919050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114610878576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d5576108cd85858381811061089757610897613fb2565b90506020020160208101906108ac91906137b6565b60065b8585858181106108c1576108c1613fb2565b90506020020135611f30565b60010161087a565b5050505050565b600160a35460ff1660018111156108f5576108f5613ccf565b1461092c576040517fd2ab239f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260a460209081526040808320815160a081018352905460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204831660608201526401000000009091049091166080820152905b82811015610a3b575f6109b68585848181106109aa576109aa613fb2565b905060200201356115b4565b9050805f036109d25760808301805160010160ff169052610a32565b60088116156109ee5760608301805160010160ff169052610a32565b6001811615610a0257825160010160ff1683525b6002811615610a1a5760208301805160010160ff1690525b6004811615610a325760408301805160010160ff1690525b5060010161098c565b5080516020820151604083015160608401516080850151600360ff95861681900486169594851681900485169493841681900484169392831681900483169291821604165f8115610a8d576001610a8f565b5f5b8315610a9c576001610a9e565b5f5b8515610aab576001610aad565b5f5b8715610aba576001610abc565b5f5b8915610ac9576001610acb565b5f5b0101010160ff16905080600103610bd7578515610b0157610aee33600188611f30565b865160039060ff160660ff168752610e7f565b8415610b3857610b1333600287611f30565b6003876020015160ff1681610b2a57610b2a613fdf565b0660ff166020880152610e7f565b8315610b6f57610b4a33600386611f30565b6003876040015160ff1681610b6157610b61613fdf565b0660ff166040880152610e7f565b8215610ba657610b8133600485611f30565b6003876060015160ff1681610b9857610b98613fdf565b0660ff166060880152610e7f565b610bb233600584611f30565b6003876080015160ff1681610bc957610bc9613fdf565b0660ff166080880152610e7f565b8060011015610e7f575f8167ffffffffffffffff811115610bfa57610bfa613971565b604051908082528060200260200182016040528015610c23578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c4057610c40613971565b604051908082528060200260200182016040528015610c69578160200160208202803683370190505b5090505f8815610cc6576001838281518110610c8757610c87613fb2565b60200260200101818152505088828280600101935081518110610cac57610cac613fb2565b6020908102919091010152895160039060ff160660ff168a525b8715610d32576002838281518110610ce057610ce0613fb2565b60200260200101818152505087828280600101935081518110610d0557610d05613fb2565b60200260200101818152505060038a6020015160ff1681610d2857610d28613fdf565b0660ff1660208b01525b8615610d9e576003838281518110610d4c57610d4c613fb2565b60200260200101818152505086828280600101935081518110610d7157610d71613fb2565b60200260200101818152505060038a6040015160ff1681610d9457610d94613fdf565b0660ff1660408b01525b8515610e0a576004838281518110610db857610db8613fb2565b60200260200101818152505085828280600101935081518110610ddd57610ddd613fb2565b60200260200101818152505060038a6060015160ff1681610e0057610e00613fdf565b0660ff1660608b01525b8415610e70576005838281518110610e2457610e24613fb2565b60200260200101818152505084828281518110610e4357610e43613fb2565b60200260200101818152505060038a6080015160ff1681610e6657610e66613fdf565b0660ff1660808b01525b610e7b338484611fcc565b5050505b5050505050508060a45f610e903390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182015f20845181549486015193860151606087015160809097015160ff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9882166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9383166201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff978316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909916929094169190911796909617949094161792909217939093169190911790557f00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be1663f3993d11610fcd3390565b61dead86866040518563ffffffff1660e01b8152600401610ff1949392919061400c565b5f604051808303815f87803b158015611008575f80fd5b505af115801561101a573d5f803e3d5ffd5b505050506110253390565b73ffffffffffffffffffffffffffffffffffffffff167fbcdecc1a9f4b8ca5f0e29df5f18f1c855d85216b93dbcab280c0978ff1a103d060405160405180910390a2505050565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611126576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d55761116185858381811061114557611145613fb2565b905060200201602081019061115a91906137b6565b60076108af565b600101611128565b6040805180820190915260035473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910462ffffff166020830181905290915f91612710906111c790866140b1565b6111d191906140c8565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8516331480611204575061120485336104e9565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d585858585856120da565b60608151835114611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610621565b5f835167ffffffffffffffff81111561134b5761134b613971565b604051908082528060200260200182016040528015611374578160200160208202803683370190505b5090505f5b84518110156113eb576113be85828151811061139757611397613fb2565b60200260200101518583815181106113b1576113b1613fb2565b6020026020010151610581565b8282815181106113d0576113d0613fb2565b60209081029190910101526113e481614100565b9050611379565b509392505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a380548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183818111156114b0576114b0613ccf565b02179055507f92a17b827ee9d42ea9454bb4ca941a1800870e6d01c0842d09ba23ccc0190ee1816040516114e49190613cfc565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8316331480611518575061151883336104e9565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612407565b505050565b5f600682901c6115c8603f841660046140b1565b600582609d81106115db576115db613fb2565b0154600f911c169392505050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b8281146116a3576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe576116f6868686848181106116c3576116c3613fb2565b90506020020160208101906116d891906137b6565b8585858181106116ea576116ea613fb2565b90506020020135612728565b6001016116a5565b505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612749565b60045473ffffffffffffffffffffffffffffffffffffffff163314611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61014d81111561184f576040517f03e231b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831680825262ffffff83166020909201829052600380547fffffffffffffffffff000000000000000000000000000000000000000000000016909117740100000000000000000000000000000000000000009092029190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a26115af82848361417c565b60a5816077811061196a575f80fd5b01805490915061197990613f61565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613f61565b80156119f05780601f106119c7576101008083540402835291602001916119f0565b820191905f5260205f20905b8154815290600101906020018083116119d357829003601f168201915b505050505081565b6107283383836127d7565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612728565b60a2805461197990613f61565b60045473ffffffffffffffffffffffffffffffffffffffff163314611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611b56576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe575f838383818110611b7357611b73613fb2565b9050602002810190611b859190614293565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509394505050505b8151811015611c1357611c0b88888886818110611bd757611bd7613fb2565b9050602002016020810190611bec91906137b6565b848481518110611bfe57611bfe613fb2565b6020026020010151612749565b600101611bb8565b5050600101611b58565b73ffffffffffffffffffffffffffffffffffffffff8516331480611c465750611c4685336104e9565b611cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d58585858585612929565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b73ffffffffffffffffffffffffffffffffffffffff8116611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610621565b611e0c81612b63565b50565b73ffffffffffffffffffffffffffffffffffffffff8316331480611e385750611e3883336104e9565b611ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612bd9565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610659575061065982612dde565b600261072882826142f7565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054839290611f6c90849061440f565b9091555050604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516915f9133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b5f5b825181101561207957818181518110611fe957611fe9613fb2565b60200260200101515f8085848151811061200557612005613fb2565b602002602001015181526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612063919061440f565b90915550612072905081614100565b9050611fce565b5073ffffffffffffffffffffffffffffffffffffffff83165f3373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8585604051611fbf929190614422565b815183511461216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff841661220e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f5b845181101561237a575f85828151811061222d5761222d613fb2565b602002602001015190505f85838151811061224a5761224a613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061235f90849061440f565b925050819055505050508061237390614100565b9050612211565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123f1929190614422565b60405180910390a46116fe818787878787612ec0565b73ffffffffffffffffffffffffffffffffffffffff83166124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b805182511461253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b60408051602081019091525f9081905233905b8351811015612695575f84828151811061256a5761256a613fb2565b602002602001015190505f84838151811061258757612587613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f9283526020838152604080852073ffffffffffffffffffffffffffffffffffffffff8b168652909152909220910390558061268d81614100565b91505061254e565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161270c929190614422565b60405180910390a460408051602081019091525f905250505050565b6115af73ffffffffffffffffffffffffffffffffffffffff84168383613149565b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906342842e0e906064015f604051808303815f87803b1580156127bc575f80fd5b505af11580156127ce573d5f803e3d5ffd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f6129d7856131d6565b90505f6129e3856131d6565b90505f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015612aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8781526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290612aeb90849061440f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b58848a8a8a8a8a61321f565b505050505050505050565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8316612c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b335f612c87846131d6565b90505f612c93846131d6565b60408051602080820183525f9182905288825281815282822073ffffffffffffffffffffffffffffffffffffffff8b1683529052205490915084811015612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90526127ce565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480612e7057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061065957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610659565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612f37908990899088908890889060040161444f565b6020604051808303815f875af1925050508015612f8f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f8c918101906144b9565b60015b61307857612f9b6144d4565b806308c379a003612fee5750612faf6144ed565b80612fba5750612ff0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106219190613851565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610621565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115af9084906133cb565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061320e5761320e613fb2565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906132969089908990889088908890600401614594565b6020604051808303815f875af19250505080156132ee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526132eb918101906144b9565b60015b6132fa57612f9b6144d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b5f61342c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134d69092919063ffffffff16565b8051909150156115af578080602001905181019061344a91906145d8565b6115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610621565b60606134e484845f856134ec565b949350505050565b60608247101561357e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610621565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516135a691906145f3565b5f6040518083038185875af1925050503d805f81146135e0576040519150601f19603f3d011682016040523d82523d5f602084013e6135e5565b606091505b50915091506135f687838387613601565b979650505050505050565b606083156136965782515f0361368f5773ffffffffffffffffffffffffffffffffffffffff85163b61368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610621565b50816134e4565b6134e48383815115612fba5781518083602001fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146136ce575f80fd5b919050565b5f80604083850312156136e4575f80fd5b6136ed836136ab565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e0c575f80fd5b5f60208284031215613738575f80fd5b8135613743816136fb565b9392505050565b5f806020838503121561375b575f80fd5b823567ffffffffffffffff80821115613772575f80fd5b818501915085601f830112613785575f80fd5b813581811115613793575f80fd5b8660208285010111156137a4575f80fd5b60209290920196919550909350505050565b5f602082840312156137c6575f80fd5b613743826136ab565b5f602082840312156137df575f80fd5b5035919050565b5f5b838110156138005781810151838201526020016137e8565b50505f910152565b5f815180845261381f8160208601602086016137e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6137436020830184613808565b5f8083601f840112613873575f80fd5b50813567ffffffffffffffff81111561388a575f80fd5b6020830191508360208260051b85010111156138a4575f80fd5b9250929050565b5f805f80604085870312156138be575f80fd5b843567ffffffffffffffff808211156138d5575f80fd5b6138e188838901613863565b909650945060208701359150808211156138f9575f80fd5b5061390687828801613863565b95989497509550505050565b5f8060208385031215613923575f80fd5b823567ffffffffffffffff811115613939575f80fd5b61394585828601613863565b90969095509350505050565b5f8060408385031215613962575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156139e2576139e2613971565b6040525050565b5f67ffffffffffffffff821115613a0257613a02613971565b5060051b60200190565b5f82601f830112613a1b575f80fd5b81356020613a28826139e9565b604051613a35828261399e565b83815260059390931b8501820192828101915086841115613a54575f80fd5b8286015b84811015613a6f5780358352918301918301613a58565b509695505050505050565b5f82601f830112613a89575f80fd5b813567ffffffffffffffff811115613aa357613aa3613971565b604051613ad860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018261399e565b818152846020838601011115613aec575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b1c575f80fd5b613b25866136ab565b9450613b33602087016136ab565b9350604086013567ffffffffffffffff80821115613b4f575f80fd5b613b5b89838a01613a0c565b94506060880135915080821115613b70575f80fd5b613b7c89838a01613a0c565b93506080880135915080821115613b91575f80fd5b50613b9e88828901613a7a565b9150509295509295909350565b5f8060408385031215613bbc575f80fd5b823567ffffffffffffffff80821115613bd3575f80fd5b818501915085601f830112613be6575f80fd5b81356020613bf3826139e9565b604051613c00828261399e565b83815260059390931b8501820192828101915089841115613c1f575f80fd5b948201945b83861015613c4457613c35866136ab565b82529482019490820190613c24565b96505086013592505080821115613c59575f80fd5b506111d185828601613a0c565b5f8151808452602080850194508084015f5b83811015613c9457815187529582019590820190600101613c78565b509495945050505050565b602081525f6137436020830184613c66565b5f60208284031215613cc1575f80fd5b813560028110613743575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160028310613d35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f805f60608486031215613d4d575f80fd5b613d56846136ab565b9250602084013567ffffffffffffffff80821115613d72575f80fd5b613d7e87838801613a0c565b93506040860135915080821115613d93575f80fd5b50613da086828701613a0c565b9150509250925092565b5f805f805f60608688031215613dbe575f80fd5b613dc7866136ab565b9450602086013567ffffffffffffffff80821115613de3575f80fd5b613def89838a01613863565b90965094506040880135915080821115613e07575f80fd5b50613e1488828901613863565b969995985093965092949392505050565b5f805f60608486031215613e37575f80fd5b613e40846136ab565b9250613e4e602085016136ab565b9150604084013590509250925092565b8015158114611e0c575f80fd5b5f8060408385031215613e7c575f80fd5b613e85836136ab565b91506020830135613e9581613e5e565b809150509250929050565b5f8060408385031215613eb1575f80fd5b613eba836136ab565b9150613ec8602084016136ab565b90509250929050565b5f805f805f60a08688031215613ee5575f80fd5b613eee866136ab565b9450613efc602087016136ab565b93506040860135925060608601359150608086013567ffffffffffffffff811115613f25575f80fd5b613b9e88828901613a7a565b5f805f60608486031215613f43575f80fd5b613f4c846136ab565b95602085013595506040909401359392505050565b600181811c90821680613f7557607f821691505b602082108103613fac577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614069575f80fd5b8260051b808560808501379190910160800195945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761065957610659614084565b5f826140fb577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361413057614130614084565b5060010190565b601f8211156115af575f81815260208120601f850160051c8101602086101561415d5750805b601f850160051c820191505b818110156116fe57828155600101614169565b67ffffffffffffffff83111561419457614194613971565b6141a8836141a28354613f61565b83614137565b5f601f8411600181146141f8575f85156141c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556108d5565b5f838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142465786850135825560209485019460019092019101614226565b5086821015614281577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142c6575f80fd5b83018035915067ffffffffffffffff8211156142e0575f80fd5b6020019150600581901b36038213156138a4575f80fd5b815167ffffffffffffffff81111561431157614311613971565b6143258161431f8454613f61565b84614137565b602080601f831160018114614377575f84156143415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556116fe565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143c3578886015182559484019460019091019084016143a4565b50858210156143ff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561065957610659614084565b604081525f6144346040830185613c66565b82810360208401526144468185613c66565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261448760a0830186613c66565b82810360608401526144998186613c66565b905082810360808401526144ad8185613808565b98975050505050505050565b5f602082840312156144c9575f80fd5b8151613743816136fb565b5f60033d11156144ea5760045f803e505f5160e01c5b90565b5f60443d10156144fa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561454857505050505090565b82850191508151818111156145605750505050505090565b843d870101602082850101111561457a5750505050505090565b6145896020828601018761399e565b509095945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526135f660a0830184613808565b5f602082840312156145e8575f80fd5b815161374381613e5e565b5f82516146048184602087016137e6565b919091019291505056fea2646970667358221220aa807317cf30e3556c177951e9174d894b769beb4ba6ae102a5d14a128cf84ab64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f000000000000000000000000000000000000000000000000000000000000014d00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5061414c777472724e6e50785151484c72785a725453667a3836484c41764876327476786e6b337461414d450000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d594a484c336e324e684d3663787146727a43655558636844595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00
-----Decoded View---------------
Arg [0] : _contractURI (string): ipfs://QmPaALwtrrNnPxQQHLrxZrTSfz86HLAvHv2tvxnk3taAME
Arg [1] : _baseURI (string): ipfs://QmYJHL3n2NhM6cxqFrzCeUXchDYY4PG5bZudFNTgEopf5Y/{id}.json
Arg [2] : _royaltiesReceiver (address): 0x50AD8FDBC19ea06fD9383F1262Ce691DC53FA99f
Arg [3] : _royaltiesPercent (uint256): 333
Arg [4] : _sanContract (address): 0x33333333333371718A3C2bB63E5F3b94C9bC13bE
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f
Arg [3] : 000000000000000000000000000000000000000000000000000000000000014d
Arg [4] : 00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d5061414c777472724e6e50785151484c72785a72545366
Arg [7] : 7a3836484c41764876327476786e6b337461414d450000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [9] : 697066733a2f2f516d594a484c336e324e684d3663787146727a436555586368
Arg [10] : 44595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00
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.