Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x1f474a20deab460b3d076f9e39a7ad9389c59f86.
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.17+commit.8df45f5f
- Verified at
- 2024-04-24T23:45:30.869052Z
contracts/facets/DiamondLoupeFacetNoERC165.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <[email protected]> (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 <[email protected]> (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 <[email protected]> (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 <[email protected]> (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 <[email protected]> (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
0x608060405234801561001057600080fd5b506110ab806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806352ef6b2c146100515780637a0ed6271461006f578063adfca15e1461008d578063cdffacc6146100bd575b600080fd5b6100596100ed565b6040516100669190610bbf565b60405180910390f35b61007761031b565b6040516100849190610dca565b60405180910390f35b6100a760048036038101906100a29190610e1d565b6107f9565b6040516100b49190610eb9565b60405180910390f35b6100d760048036038101906100d29190610f07565b6109e6565b6040516100e49190610f43565b60405180910390f35b606060006100f9610a72565b90506000816001018054905090508067ffffffffffffffff81111561012157610120610f5e565b5b60405190808252806020026020018201604052801561014f5781602001602082028036833780820191505090505b5092506000805b8281101561031157600084600101828154811061017657610175610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b8581101561028b5788818151811061023557610234610f8d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610278576001915061028b565b808061028390610ff5565b91505061021a565b50801561029e57600090505050506102fe565b818886815181106102b2576102b1610f8d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806102f790610ff5565b9550505050505b808061030990610ff5565b915050610156565b5080845250505090565b60606000610327610a72565b90506000816001018054905090508067ffffffffffffffff81111561034f5761034e610f5e565b5b60405190808252806020026020018201604052801561038857816020015b610375610a9f565b81526020019060019003908161036d5790505b50925060008167ffffffffffffffff8111156103a7576103a6610f5e565b5b6040519080825280602002602001820160405280156103d55781602001602082028036833780820191505090505b5090506000805b838110156107845760008560010182815481106103fc576103fb610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156105e5578273ffffffffffffffffffffffffffffffffffffffff168a82815181106104d2576104d1610f8d565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036105d257838a828151811061050d5761050c610f8d565b5b60200260200101516020015188838151811061052c5761052b610f8d565b5b602002602001015161ffff168151811061054957610548610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250508681815181106105a8576105a7610f8d565b5b6020026020010180518091906105bd9061104b565b61ffff1661ffff1681525050600191506105e5565b80806105dd90610ff5565b9150506104a0565b5080156105f85760009050505050610771565b8189868151811061060c5761060b610f8d565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561066457610663610f5e565b5b6040519080825280602002602001820160405280156106925781602001602082028036833780820191505090505b508986815181106106a6576106a5610f8d565b5b602002602001015160200181905250828986815181106106c9576106c8610f8d565b5b6020026020010151602001516000815181106106e8576106e7610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050600186868151811061074957610748610f8d565b5b602002602001019061ffff16908161ffff1681525050848061076a90610ff5565b9550505050505b808061077c90610ff5565b9150506103dc565b5060005b818110156107ee5760008382815181106107a5576107a4610f8d565b5b602002602001015161ffff16905060008783815181106107c8576107c7610f8d565b5b6020026020010151602001519050818152505080806107e690610ff5565b915050610788565b508085525050505090565b60606000610805610a72565b905060008160010180549050905060008167ffffffffffffffff81111561082f5761082e610f5e565b5b60405190808252806020026020018201604052801561085d5781602001602082028036833780820191505090505b50935060005b828110156109da57600084600101828154811061088357610882610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036109c5578187858151811061096a57610969610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505083806109c190610ff5565b9450505b505080806109d290610ff5565b915050610863565b50808452505050919050565b6000806109f1610a72565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b2682610afb565b9050919050565b610b3681610b1b565b82525050565b6000610b488383610b2d565b60208301905092915050565b6000602082019050919050565b6000610b6c82610acf565b610b768185610ada565b9350610b8183610aeb565b8060005b83811015610bb2578151610b998882610b3c565b9750610ba483610b54565b925050600181019050610b85565b5085935050505092915050565b60006020820190508181036000830152610bd98184610b61565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610c6e81610c39565b82525050565b6000610c808383610c65565b60208301905092915050565b6000602082019050919050565b6000610ca482610c0d565b610cae8185610c18565b9350610cb983610c29565b8060005b83811015610cea578151610cd18882610c74565b9750610cdc83610c8c565b925050600181019050610cbd565b5085935050505092915050565b6000604083016000830151610d0f6000860182610b2d565b5060208301518482036020860152610d278282610c99565b9150508091505092915050565b6000610d408383610cf7565b905092915050565b6000602082019050919050565b6000610d6082610be1565b610d6a8185610bec565b935083602082028501610d7c85610bfd565b8060005b85811015610db85784840389528151610d998582610d34565b9450610da483610d48565b925060208a01995050600181019050610d80565b50829750879550505050505092915050565b60006020820190508181036000830152610de48184610d55565b905092915050565b600080fd5b610dfa81610b1b565b8114610e0557600080fd5b50565b600081359050610e1781610df1565b92915050565b600060208284031215610e3357610e32610dec565b5b6000610e4184828501610e08565b91505092915050565b600082825260208201905092915050565b6000610e6682610c0d565b610e708185610e4a565b9350610e7b83610c29565b8060005b83811015610eac578151610e938882610c74565b9750610e9e83610c8c565b925050600181019050610e7f565b5085935050505092915050565b60006020820190508181036000830152610ed38184610e5b565b905092915050565b610ee481610c39565b8114610eef57600080fd5b50565b600081359050610f0181610edb565b92915050565b600060208284031215610f1d57610f1c610dec565b5b6000610f2b84828501610ef2565b91505092915050565b610f3d81610b1b565b82525050565b6000602082019050610f586000830184610f34565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600061100082610feb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361103257611031610fbc565b5b600182019050919050565b600061ffff82169050919050565b60006110568261103d565b915061ffff820361106a57611069610fbc565b5b60018201905091905056fea26469706673582212205269c165bec45f1b0cc36ad71b94c8e35b1bcea74ad172509ecba10958af8afe64736f6c63430008110033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806352ef6b2c146100515780637a0ed6271461006f578063adfca15e1461008d578063cdffacc6146100bd575b600080fd5b6100596100ed565b6040516100669190610bbf565b60405180910390f35b61007761031b565b6040516100849190610dca565b60405180910390f35b6100a760048036038101906100a29190610e1d565b6107f9565b6040516100b49190610eb9565b60405180910390f35b6100d760048036038101906100d29190610f07565b6109e6565b6040516100e49190610f43565b60405180910390f35b606060006100f9610a72565b90506000816001018054905090508067ffffffffffffffff81111561012157610120610f5e565b5b60405190808252806020026020018201604052801561014f5781602001602082028036833780820191505090505b5092506000805b8281101561031157600084600101828154811061017657610175610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b8581101561028b5788818151811061023557610234610f8d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610278576001915061028b565b808061028390610ff5565b91505061021a565b50801561029e57600090505050506102fe565b818886815181106102b2576102b1610f8d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806102f790610ff5565b9550505050505b808061030990610ff5565b915050610156565b5080845250505090565b60606000610327610a72565b90506000816001018054905090508067ffffffffffffffff81111561034f5761034e610f5e565b5b60405190808252806020026020018201604052801561038857816020015b610375610a9f565b81526020019060019003908161036d5790505b50925060008167ffffffffffffffff8111156103a7576103a6610f5e565b5b6040519080825280602002602001820160405280156103d55781602001602082028036833780820191505090505b5090506000805b838110156107845760008560010182815481106103fc576103fb610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b858110156105e5578273ffffffffffffffffffffffffffffffffffffffff168a82815181106104d2576104d1610f8d565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036105d257838a828151811061050d5761050c610f8d565b5b60200260200101516020015188838151811061052c5761052b610f8d565b5b602002602001015161ffff168151811061054957610548610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250508681815181106105a8576105a7610f8d565b5b6020026020010180518091906105bd9061104b565b61ffff1661ffff1681525050600191506105e5565b80806105dd90610ff5565b9150506104a0565b5080156105f85760009050505050610771565b8189868151811061060c5761060b610f8d565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561066457610663610f5e565b5b6040519080825280602002602001820160405280156106925781602001602082028036833780820191505090505b508986815181106106a6576106a5610f8d565b5b602002602001015160200181905250828986815181106106c9576106c8610f8d565b5b6020026020010151602001516000815181106106e8576106e7610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050600186868151811061074957610748610f8d565b5b602002602001019061ffff16908161ffff1681525050848061076a90610ff5565b9550505050505b808061077c90610ff5565b9150506103dc565b5060005b818110156107ee5760008382815181106107a5576107a4610f8d565b5b602002602001015161ffff16905060008783815181106107c8576107c7610f8d565b5b6020026020010151602001519050818152505080806107e690610ff5565b915050610788565b508085525050505090565b60606000610805610a72565b905060008160010180549050905060008167ffffffffffffffff81111561082f5761082e610f5e565b5b60405190808252806020026020018201604052801561085d5781602001602082028036833780820191505090505b50935060005b828110156109da57600084600101828154811061088357610882610f8d565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036109c5578187858151811061096a57610969610f8d565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505083806109c190610ff5565b9450505b505080806109d290610ff5565b915050610863565b50808452505050919050565b6000806109f1610a72565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b2682610afb565b9050919050565b610b3681610b1b565b82525050565b6000610b488383610b2d565b60208301905092915050565b6000602082019050919050565b6000610b6c82610acf565b610b768185610ada565b9350610b8183610aeb565b8060005b83811015610bb2578151610b998882610b3c565b9750610ba483610b54565b925050600181019050610b85565b5085935050505092915050565b60006020820190508181036000830152610bd98184610b61565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610c6e81610c39565b82525050565b6000610c808383610c65565b60208301905092915050565b6000602082019050919050565b6000610ca482610c0d565b610cae8185610c18565b9350610cb983610c29565b8060005b83811015610cea578151610cd18882610c74565b9750610cdc83610c8c565b925050600181019050610cbd565b5085935050505092915050565b6000604083016000830151610d0f6000860182610b2d565b5060208301518482036020860152610d278282610c99565b9150508091505092915050565b6000610d408383610cf7565b905092915050565b6000602082019050919050565b6000610d6082610be1565b610d6a8185610bec565b935083602082028501610d7c85610bfd565b8060005b85811015610db85784840389528151610d998582610d34565b9450610da483610d48565b925060208a01995050600181019050610d80565b50829750879550505050505092915050565b60006020820190508181036000830152610de48184610d55565b905092915050565b600080fd5b610dfa81610b1b565b8114610e0557600080fd5b50565b600081359050610e1781610df1565b92915050565b600060208284031215610e3357610e32610dec565b5b6000610e4184828501610e08565b91505092915050565b600082825260208201905092915050565b6000610e6682610c0d565b610e708185610e4a565b9350610e7b83610c29565b8060005b83811015610eac578151610e938882610c74565b9750610e9e83610c8c565b925050600181019050610e7f565b5085935050505092915050565b60006020820190508181036000830152610ed38184610e5b565b905092915050565b610ee481610c39565b8114610eef57600080fd5b50565b600081359050610f0181610edb565b92915050565b600060208284031215610f1d57610f1c610dec565b5b6000610f2b84828501610ef2565b91505092915050565b610f3d81610b1b565b82525050565b6000602082019050610f586000830184610f34565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600061100082610feb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361103257611031610fbc565b5b600182019050919050565b600061ffff82169050919050565b60006110568261103d565b915061ffff820361106a57611069610fbc565b5b60018201905091905056fea26469706673582212205269c165bec45f1b0cc36ad71b94c8e35b1bcea74ad172509ecba10958af8afe64736f6c63430008110033