Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0xd2eb2143b630aad31d73a80edbaabd7e1f5e2b0e.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
- Contract name:
- DiamondLoupeFacetNoERC165
- Optimization enabled
- false
- Compiler version
- v0.8.24+commit.e11b9ed9
- Verified at
- 2024-07-12T10:16:30.948486Z
contracts/facets/DiamondLoupeFacetNoERC165.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ // The functions in DiamondLoupeFacet MUST be added to a diamond. // The EIP-2535 Diamond standard requires these functions. import { LibDiamond } from "../libraries/LibDiamond.sol"; import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; contract DiamondLoupeFacetNoERC165 is IDiamondLoupe { // Diamond Loupe Functions //////////////////////////////////////////////////////////////////// /// These functions are expected to be called frequently by tools. // // struct Facet { // address facetAddress; // bytes4[] functionSelectors; // } /// @notice Gets all facets and their selectors. /// @return facets_ Facet function facets() external view override returns (Facet[] memory facets_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); uint256 selectorCount = ds.selectors.length; // create an array set to the maximum size possible facets_ = new Facet[](selectorCount); // create an array for counting the number of selectors for each facet uint16[] memory numFacetSelectors = new uint16[](selectorCount); // total number of facets uint256 numFacets; // loop through function selectors for ( uint256 selectorIndex; selectorIndex < selectorCount; selectorIndex++ ) { bytes4 selector = ds.selectors[selectorIndex]; address facetAddress_ = ds .facetAddressAndSelectorPosition[selector] .facetAddress; bool continueLoop = false; // find the functionSelectors array for selector and add selector to it for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { if (facets_[facetIndex].facetAddress == facetAddress_) { facets_[facetIndex].functionSelectors[ numFacetSelectors[facetIndex] ] = selector; numFacetSelectors[facetIndex]++; continueLoop = true; break; } } // if functionSelectors array exists for selector then continue loop if (continueLoop) { continueLoop = false; continue; } // create a new functionSelectors array for selector facets_[numFacets].facetAddress = facetAddress_; facets_[numFacets].functionSelectors = new bytes4[](selectorCount); facets_[numFacets].functionSelectors[0] = selector; numFacetSelectors[numFacets] = 1; numFacets++; } for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { uint256 numSelectors = numFacetSelectors[facetIndex]; bytes4[] memory selectors = facets_[facetIndex].functionSelectors; // setting the number of selectors assembly { mstore(selectors, numSelectors) } } // setting the number of facets assembly { mstore(facets_, numFacets) } } /// @notice Gets all the function selectors supported by a specific facet. /// @param _facet The facet address. /// @return _facetFunctionSelectors The selectors associated with a facet address. function facetFunctionSelectors( address _facet ) external view override returns (bytes4[] memory _facetFunctionSelectors) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); uint256 selectorCount = ds.selectors.length; uint256 numSelectors; _facetFunctionSelectors = new bytes4[](selectorCount); // loop through function selectors for ( uint256 selectorIndex; selectorIndex < selectorCount; selectorIndex++ ) { bytes4 selector = ds.selectors[selectorIndex]; address facetAddress_ = ds .facetAddressAndSelectorPosition[selector] .facetAddress; if (_facet == facetAddress_) { _facetFunctionSelectors[numSelectors] = selector; numSelectors++; } } // Set the number of selectors in the array assembly { mstore(_facetFunctionSelectors, numSelectors) } } /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view override returns (address[] memory facetAddresses_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); uint256 selectorCount = ds.selectors.length; // create an array set to the maximum size possible facetAddresses_ = new address[](selectorCount); uint256 numFacets; // loop through function selectors for ( uint256 selectorIndex; selectorIndex < selectorCount; selectorIndex++ ) { bytes4 selector = ds.selectors[selectorIndex]; address facetAddress_ = ds .facetAddressAndSelectorPosition[selector] .facetAddress; bool continueLoop = false; // see if we have collected the address already and break out of loop if we have for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { if (facetAddress_ == facetAddresses_[facetIndex]) { continueLoop = true; break; } } // continue loop if we already have the address if (continueLoop) { continueLoop = false; continue; } // include address facetAddresses_[numFacets] = facetAddress_; numFacets++; } // Set the number of facet addresses in the array assembly { mstore(facetAddresses_, numFacets) } } /// @notice Gets the facet address that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress( bytes4 _functionSelector ) external view override returns (address facetAddress_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); facetAddress_ = ds .facetAddressAndSelectorPosition[_functionSelector] .facetAddress; } }
contracts/interfaces/IDiamond.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamond { enum FacetCutAction { Add, Replace, Remove } // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
contracts/interfaces/IDiamondCut.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamond } from "./IDiamond.sol"; interface IDiamondCut is IDiamond { /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; }
contracts/interfaces/IDiamondLoupe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ // A loupe is a small magnifying glass used to look at diamonds. // These functions look at diamonds interface IDiamondLoupe { /// These functions are expected to be called frequently /// by tools. struct Facet { address facetAddress; bytes4[] functionSelectors; } /// @notice Gets all facet addresses and their four byte function selectors. /// @return facets_ Facet function facets() external view returns (Facet[] memory facets_); /// @notice Gets all the function selectors supported by a specific facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors( address _facet ) external view returns (bytes4[] memory facetFunctionSelectors_); /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view returns (address[] memory facetAddresses_); /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress( bytes4 _functionSelector ) external view returns (address facetAddress_); }
contracts/libraries/LibDiamond.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamond } from "../interfaces/IDiamond.sol"; import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard error NoSelectorsGivenToAdd(); error NotContractOwner(address _user, address _contractOwner); error NoSelectorsProvidedForFacetForCut(address _facetAddress); error CannotAddSelectorsToZeroAddress(bytes4[] _selectors); error NoBytecodeAtAddress(address _contractAddress, string _message); error IncorrectFacetCutAction(uint8 _action); error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector); error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors); error CannotReplaceImmutableFunction(bytes4 _selector); error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet( bytes4 _selector ); error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector); error RemoveFacetAddressMustBeZeroAddress(address _facetAddress); error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector); error CannotRemoveImmutableFunction(bytes4 _selector); error InitializationFunctionReverted( address _initializationContractAddress, bytes _calldata ); library LibDiamond { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndSelectorPosition { address facetAddress; uint16 selectorPosition; } struct DiamondStorage { // function selector => facet address and selector position in selectors array mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; bytes4[] selectors; mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { if (msg.sender != diamondStorage().contractOwner) { revert NotContractOwner(msg.sender, diamondStorage().contractOwner); } } event DiamondCut( IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata ); // Internal function version of diamondCut function diamondCut( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for ( uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++ ) { bytes4[] memory functionSelectors = _diamondCut[facetIndex] .functionSelectors; address facetAddress = _diamondCut[facetIndex].facetAddress; if (functionSelectors.length == 0) { revert NoSelectorsProvidedForFacetForCut(facetAddress); } IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamond.FacetCutAction.Add) { addFunctions(facetAddress, functionSelectors); } else if (action == IDiamond.FacetCutAction.Replace) { replaceFunctions(facetAddress, functionSelectors); } else if (action == IDiamond.FacetCutAction.Remove) { removeFunctions(facetAddress, functionSelectors); } else { revert IncorrectFacetCutAction(uint8(action)); } } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { if (_facetAddress == address(0)) { revert CannotAddSelectorsToZeroAddress(_functionSelectors); } DiamondStorage storage ds = diamondStorage(); uint16 selectorCount = uint16(ds.selectors.length); enforceHasContractCode( _facetAddress, "LibDiamondCut: Add facet has no code" ); for ( uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++ ) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds .facetAddressAndSelectorPosition[selector] .facetAddress; if (oldFacetAddress != address(0)) { revert CannotAddFunctionToDiamondThatAlreadyExists(selector); } ds.facetAddressAndSelectorPosition[ selector ] = FacetAddressAndSelectorPosition(_facetAddress, selectorCount); ds.selectors.push(selector); selectorCount++; } } function replaceFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { DiamondStorage storage ds = diamondStorage(); if (_facetAddress == address(0)) { revert CannotReplaceFunctionsFromFacetWithZeroAddress( _functionSelectors ); } enforceHasContractCode( _facetAddress, "LibDiamondCut: Replace facet has no code" ); for ( uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++ ) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds .facetAddressAndSelectorPosition[selector] .facetAddress; // can't replace immutable functions -- functions defined directly in the diamond in this case if (oldFacetAddress == address(this)) { revert CannotReplaceImmutableFunction(selector); } if (oldFacetAddress == _facetAddress) { revert CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet( selector ); } if (oldFacetAddress == address(0)) { revert CannotReplaceFunctionThatDoesNotExists(selector); } // replace old facet address ds .facetAddressAndSelectorPosition[selector] .facetAddress = _facetAddress; } } function removeFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { DiamondStorage storage ds = diamondStorage(); uint256 selectorCount = ds.selectors.length; if (_facetAddress != address(0)) { revert RemoveFacetAddressMustBeZeroAddress(_facetAddress); } for ( uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++ ) { bytes4 selector = _functionSelectors[selectorIndex]; FacetAddressAndSelectorPosition memory oldFacetAddressAndSelectorPosition = ds .facetAddressAndSelectorPosition[selector]; if (oldFacetAddressAndSelectorPosition.facetAddress == address(0)) { revert CannotRemoveFunctionThatDoesNotExist(selector); } // can't remove immutable functions -- functions defined directly in the diamond if ( oldFacetAddressAndSelectorPosition.facetAddress == address(this) ) { revert CannotRemoveImmutableFunction(selector); } // replace selector with last selector selectorCount--; if ( oldFacetAddressAndSelectorPosition.selectorPosition != selectorCount ) { bytes4 lastSelector = ds.selectors[selectorCount]; ds.selectors[ oldFacetAddressAndSelectorPosition.selectorPosition ] = lastSelector; ds .facetAddressAndSelectorPosition[lastSelector] .selectorPosition = oldFacetAddressAndSelectorPosition .selectorPosition; } // delete last selector ds.selectors.pop(); delete ds.facetAddressAndSelectorPosition[selector]; } } function initializeDiamondCut( address _init, bytes memory _calldata ) internal { if (_init == address(0)) { return; } enforceHasContractCode( _init, "LibDiamondCut: _init address has no code" ); (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up error /// @solidity memory-safe-assembly assembly { let returndata_size := mload(error) revert(add(32, error), returndata_size) } } else { revert InitializationFunctionReverted(_init, _calldata); } } } function enforceHasContractCode( address _contract, string memory _errorMessage ) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } if (contractSize == 0) { revert NoBytecodeAtAddress(_contract, _errorMessage); } } }
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"facetAddress_","internalType":"address"}],"name":"facetAddress","inputs":[{"type":"bytes4","name":"_functionSelector","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"facetAddresses_","internalType":"address[]"}],"name":"facetAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4[]","name":"_facetFunctionSelectors","internalType":"bytes4[]"}],"name":"facetFunctionSelectors","inputs":[{"type":"address","name":"_facet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"facets_","internalType":"struct IDiamondLoupe.Facet[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]}],"name":"facets","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50611087806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806352ef6b2c146100515780637a0ed6271461006f578063adfca15e1461008d578063cdffacc6146100bd575b600080fd5b6100596100ed565b6040516100669190610b9b565b60405180910390f35b61007761030f565b6040516100849190610da6565b60405180910390f35b6100a760048036038101906100a29190610df9565b6107db565b6040516100b49190610e95565b60405180910390f35b6100d760048036038101906100d29190610ee3565b6109c2565b6040516100e49190610f1f565b60405180910390f35b606060006100f9610a4e565b90506000816001018054905090508067ffffffffffffffff81111561012157610120610f3a565b5b60405190808252806020026020018201604052801561014f5781602001602082028036833780820191505090505b5092506000805b8281101561030557600084600101828154811061017657610175610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156102855788818151811061023557610234610f69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036102785760019150610285565b808060010191505061021a565b50801561029857600090505050506102f8565b818886815181106102ac576102ab610f69565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806102f190610fd1565b9550505050505b8080600101915050610156565b5080845250505090565b6060600061031b610a4e565b90506000816001018054905090508067ffffffffffffffff81111561034357610342610f3a565b5b60405190808252806020026020018201604052801561037c57816020015b610369610a7b565b8152602001906001900390816103615790505b50925060008167ffffffffffffffff81111561039b5761039a610f3a565b5b6040519080825280602002602001820160405280156103c95781602001602082028036833780820191505090505b5090506000805b8381101561076c5760008560010182815481106103f0576103ef610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156105d3578273ffffffffffffffffffffffffffffffffffffffff168a82815181106104c6576104c5610f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036105c657838a828151811061050157610500610f69565b5b6020026020010151602001518883815181106105205761051f610f69565b5b602002602001015161ffff168151811061053d5761053c610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505086818151811061059c5761059b610f69565b5b6020026020010180518091906105b190611027565b61ffff1661ffff1681525050600191506105d3565b8080600101915050610494565b5080156105e6576000905050505061075f565b818986815181106105fa576105f9610f69565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561065257610651610f3a565b5b6040519080825280602002602001820160405280156106805781602001602082028036833780820191505090505b5089868151811061069457610693610f69565b5b602002602001015160200181905250828986815181106106b7576106b6610f69565b5b6020026020010151602001516000815181106106d6576106d5610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050600186868151811061073757610736610f69565b5b602002602001019061ffff16908161ffff1681525050848061075890610fd1565b9550505050505b80806001019150506103d0565b5060005b818110156107d057600083828151811061078d5761078c610f69565b5b602002602001015161ffff16905060008783815181106107b0576107af610f69565b5b602002602001015160200151905081815250508080600101915050610770565b508085525050505090565b606060006107e7610a4e565b905060008160010180549050905060008167ffffffffffffffff81111561081157610810610f3a565b5b60405190808252806020026020018201604052801561083f5781602001602082028036833780820191505090505b50935060005b828110156109b657600084600101828154811061086557610864610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036109a7578187858151811061094c5761094b610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505083806109a390610fd1565b9450505b50508080600101915050610845565b50808452505050919050565b6000806109cd610a4e565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b0282610ad7565b9050919050565b610b1281610af7565b82525050565b6000610b248383610b09565b60208301905092915050565b6000602082019050919050565b6000610b4882610aab565b610b528185610ab6565b9350610b5d83610ac7565b8060005b83811015610b8e578151610b758882610b18565b9750610b8083610b30565b925050600181019050610b61565b5085935050505092915050565b60006020820190508181036000830152610bb58184610b3d565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610c4a81610c15565b82525050565b6000610c5c8383610c41565b60208301905092915050565b6000602082019050919050565b6000610c8082610be9565b610c8a8185610bf4565b9350610c9583610c05565b8060005b83811015610cc6578151610cad8882610c50565b9750610cb883610c68565b925050600181019050610c99565b5085935050505092915050565b6000604083016000830151610ceb6000860182610b09565b5060208301518482036020860152610d038282610c75565b9150508091505092915050565b6000610d1c8383610cd3565b905092915050565b6000602082019050919050565b6000610d3c82610bbd565b610d468185610bc8565b935083602082028501610d5885610bd9565b8060005b85811015610d945784840389528151610d758582610d10565b9450610d8083610d24565b925060208a01995050600181019050610d5c565b50829750879550505050505092915050565b60006020820190508181036000830152610dc08184610d31565b905092915050565b600080fd5b610dd681610af7565b8114610de157600080fd5b50565b600081359050610df381610dcd565b92915050565b600060208284031215610e0f57610e0e610dc8565b5b6000610e1d84828501610de4565b91505092915050565b600082825260208201905092915050565b6000610e4282610be9565b610e4c8185610e26565b9350610e5783610c05565b8060005b83811015610e88578151610e6f8882610c50565b9750610e7a83610c68565b925050600181019050610e5b565b5085935050505092915050565b60006020820190508181036000830152610eaf8184610e37565b905092915050565b610ec081610c15565b8114610ecb57600080fd5b50565b600081359050610edd81610eb7565b92915050565b600060208284031215610ef957610ef8610dc8565b5b6000610f0784828501610ece565b91505092915050565b610f1981610af7565b82525050565b6000602082019050610f346000830184610f10565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000610fdc82610fc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361100e5761100d610f98565b5b600182019050919050565b600061ffff82169050919050565b600061103282611019565b915061ffff820361104657611045610f98565b5b60018201905091905056fea26469706673582212201d05d22f92eb7d74d07dc4d6bd3b05afd5e920bf99b0fbc6cb0f5f9eb044cb5f64736f6c63430008180033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806352ef6b2c146100515780637a0ed6271461006f578063adfca15e1461008d578063cdffacc6146100bd575b600080fd5b6100596100ed565b6040516100669190610b9b565b60405180910390f35b61007761030f565b6040516100849190610da6565b60405180910390f35b6100a760048036038101906100a29190610df9565b6107db565b6040516100b49190610e95565b60405180910390f35b6100d760048036038101906100d29190610ee3565b6109c2565b6040516100e49190610f1f565b60405180910390f35b606060006100f9610a4e565b90506000816001018054905090508067ffffffffffffffff81111561012157610120610f3a565b5b60405190808252806020026020018201604052801561014f5781602001602082028036833780820191505090505b5092506000805b8281101561030557600084600101828154811061017657610175610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156102855788818151811061023557610234610f69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036102785760019150610285565b808060010191505061021a565b50801561029857600090505050506102f8565b818886815181106102ac576102ab610f69565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806102f190610fd1565b9550505050505b8080600101915050610156565b5080845250505090565b6060600061031b610a4e565b90506000816001018054905090508067ffffffffffffffff81111561034357610342610f3a565b5b60405190808252806020026020018201604052801561037c57816020015b610369610a7b565b8152602001906001900390816103615790505b50925060008167ffffffffffffffff81111561039b5761039a610f3a565b5b6040519080825280602002602001820160405280156103c95781602001602082028036833780820191505090505b5090506000805b8381101561076c5760008560010182815481106103f0576103ef610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156105d3578273ffffffffffffffffffffffffffffffffffffffff168a82815181106104c6576104c5610f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036105c657838a828151811061050157610500610f69565b5b6020026020010151602001518883815181106105205761051f610f69565b5b602002602001015161ffff168151811061053d5761053c610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505086818151811061059c5761059b610f69565b5b6020026020010180518091906105b190611027565b61ffff1661ffff1681525050600191506105d3565b8080600101915050610494565b5080156105e6576000905050505061075f565b818986815181106105fa576105f9610f69565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561065257610651610f3a565b5b6040519080825280602002602001820160405280156106805781602001602082028036833780820191505090505b5089868151811061069457610693610f69565b5b602002602001015160200181905250828986815181106106b7576106b6610f69565b5b6020026020010151602001516000815181106106d6576106d5610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050600186868151811061073757610736610f69565b5b602002602001019061ffff16908161ffff1681525050848061075890610fd1565b9550505050505b80806001019150506103d0565b5060005b818110156107d057600083828151811061078d5761078c610f69565b5b602002602001015161ffff16905060008783815181106107b0576107af610f69565b5b602002602001015160200151905081815250508080600101915050610770565b508085525050505090565b606060006107e7610a4e565b905060008160010180549050905060008167ffffffffffffffff81111561081157610810610f3a565b5b60405190808252806020026020018201604052801561083f5781602001602082028036833780820191505090505b50935060005b828110156109b657600084600101828154811061086557610864610f69565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036109a7578187858151811061094c5761094b610f69565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505083806109a390610fd1565b9450505b50508080600101915050610845565b50808452505050919050565b6000806109cd610a4e565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b0282610ad7565b9050919050565b610b1281610af7565b82525050565b6000610b248383610b09565b60208301905092915050565b6000602082019050919050565b6000610b4882610aab565b610b528185610ab6565b9350610b5d83610ac7565b8060005b83811015610b8e578151610b758882610b18565b9750610b8083610b30565b925050600181019050610b61565b5085935050505092915050565b60006020820190508181036000830152610bb58184610b3d565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610c4a81610c15565b82525050565b6000610c5c8383610c41565b60208301905092915050565b6000602082019050919050565b6000610c8082610be9565b610c8a8185610bf4565b9350610c9583610c05565b8060005b83811015610cc6578151610cad8882610c50565b9750610cb883610c68565b925050600181019050610c99565b5085935050505092915050565b6000604083016000830151610ceb6000860182610b09565b5060208301518482036020860152610d038282610c75565b9150508091505092915050565b6000610d1c8383610cd3565b905092915050565b6000602082019050919050565b6000610d3c82610bbd565b610d468185610bc8565b935083602082028501610d5885610bd9565b8060005b85811015610d945784840389528151610d758582610d10565b9450610d8083610d24565b925060208a01995050600181019050610d5c565b50829750879550505050505092915050565b60006020820190508181036000830152610dc08184610d31565b905092915050565b600080fd5b610dd681610af7565b8114610de157600080fd5b50565b600081359050610df381610dcd565b92915050565b600060208284031215610e0f57610e0e610dc8565b5b6000610e1d84828501610de4565b91505092915050565b600082825260208201905092915050565b6000610e4282610be9565b610e4c8185610e26565b9350610e5783610c05565b8060005b83811015610e88578151610e6f8882610c50565b9750610e7a83610c68565b925050600181019050610e5b565b5085935050505092915050565b60006020820190508181036000830152610eaf8184610e37565b905092915050565b610ec081610c15565b8114610ecb57600080fd5b50565b600081359050610edd81610eb7565b92915050565b600060208284031215610ef957610ef8610dc8565b5b6000610f0784828501610ece565b91505092915050565b610f1981610af7565b82525050565b6000602082019050610f346000830184610f10565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000610fdc82610fc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361100e5761100d610f98565b5b600182019050919050565b600061ffff82169050919050565b600061103282611019565b915061ffff820361104657611045610f98565b5b60018201905091905056fea26469706673582212201d05d22f92eb7d74d07dc4d6bd3b05afd5e920bf99b0fbc6cb0f5f9eb044cb5f64736f6c63430008180033