- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x9c3A8996e26BA70283f006e6b3eBcC2968d6A94e

Creator
0x046bf7–da7b9c at 0xe61dd5–b723e8
Balance
0 LIT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
2793621
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x706381425f4ef773587679cc7ee4dbd95374f9de.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
DiamondLoupeFacet




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




Verified at
2023-11-14T15:41:10.245690Z

contracts/facets/DiamondLoupeFacet.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";
import { IERC165 } from "../interfaces/IERC165.sol";

contract DiamondLoupeFacet is IDiamondLoupe, IERC165 {
    // 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;
    }

    // This implements ERC-165.
    function supportsInterface(
        bytes4 _interfaceId
    ) external view override returns (bool) {
        LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage();
        return ds.supportedInterfaces[_interfaceId];
    }
}
        

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/interfaces/IERC165.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
          

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":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"_interfaceId","internalType":"bytes4"}]}]
            

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b50611192806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806301ffc9a71461005c57806352ef6b2c1461008c5780637a0ed627146100aa578063adfca15e146100c8578063cdffacc6146100f8575b600080fd5b61007660048036038101906100719190610bdd565b610128565b6040516100839190610c25565b60405180910390f35b61009461019e565b6040516100a19190610d30565b60405180910390f35b6100b26103cc565b6040516100bf9190610f0f565b60405180910390f35b6100e260048036038101906100dd9190610f5d565b6108aa565b6040516100ef9190610ff9565b60405180910390f35b610112600480360381019061010d9190610bdd565b610a97565b60405161011f919061102a565b60405180910390f35b600080610133610b23565b9050806002016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16915050919050565b606060006101aa610b23565b90506000816001018054905090508067ffffffffffffffff8111156101d2576101d1611045565b5b6040519080825280602002602001820160405280156102005781602001602082028036833780820191505090505b5092506000805b828110156103c257600084600101828154811061022757610226611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b8581101561033c578881815181106102e6576102e5611074565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610329576001915061033c565b8080610334906110dc565b9150506102cb565b50801561034f57600090505050506103af565b8188868151811061036357610362611074565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806103a8906110dc565b9550505050505b80806103ba906110dc565b915050610207565b5080845250505090565b606060006103d8610b23565b90506000816001018054905090508067ffffffffffffffff811115610400576103ff611045565b5b60405190808252806020026020018201604052801561043957816020015b610426610b50565b81526020019060019003908161041e5790505b50925060008167ffffffffffffffff81111561045857610457611045565b5b6040519080825280602002602001820160405280156104865781602001602082028036833780820191505090505b5090506000805b838110156108355760008560010182815481106104ad576104ac611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b85811015610696578273ffffffffffffffffffffffffffffffffffffffff168a828151811061058357610582611074565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361068357838a82815181106105be576105bd611074565b5b6020026020010151602001518883815181106105dd576105dc611074565b5b602002602001015161ffff16815181106105fa576105f9611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505086818151811061065957610658611074565b5b60200260200101805180919061066e90611132565b61ffff1661ffff168152505060019150610696565b808061068e906110dc565b915050610551565b5080156106a95760009050505050610822565b818986815181106106bd576106bc611074565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561071557610714611045565b5b6040519080825280602002602001820160405280156107435781602001602082028036833780820191505090505b5089868151811061075757610756611074565b5b6020026020010151602001819052508289868151811061077a57610779611074565b5b60200260200101516020015160008151811061079957610798611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060018686815181106107fa576107f9611074565b5b602002602001019061ffff16908161ffff1681525050848061081b906110dc565b9550505050505b808061082d906110dc565b91505061048d565b5060005b8181101561089f57600083828151811061085657610855611074565b5b602002602001015161ffff169050600087838151811061087957610878611074565b5b602002602001015160200151905081815250508080610897906110dc565b915050610839565b508085525050505090565b606060006108b6610b23565b905060008160010180549050905060008167ffffffffffffffff8111156108e0576108df611045565b5b60405190808252806020026020018201604052801561090e5781602001602082028036833780820191505090505b50935060005b82811015610a8b57600084600101828154811061093457610933611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603610a765781878581518110610a1b57610a1a611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250508380610a72906110dc565b9450505b50508080610a83906110dc565b915050610914565b50808452505050919050565b600080610aa2610b23565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610bba81610b85565b8114610bc557600080fd5b50565b600081359050610bd781610bb1565b92915050565b600060208284031215610bf357610bf2610b80565b5b6000610c0184828501610bc8565b91505092915050565b60008115159050919050565b610c1f81610c0a565b82525050565b6000602082019050610c3a6000830184610c16565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c9782610c6c565b9050919050565b610ca781610c8c565b82525050565b6000610cb98383610c9e565b60208301905092915050565b6000602082019050919050565b6000610cdd82610c40565b610ce78185610c4b565b9350610cf283610c5c565b8060005b83811015610d23578151610d0a8882610cad565b9750610d1583610cc5565b925050600181019050610cf6565b5085935050505092915050565b60006020820190508181036000830152610d4a8184610cd2565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610db381610b85565b82525050565b6000610dc58383610daa565b60208301905092915050565b6000602082019050919050565b6000610de982610d7e565b610df38185610d89565b9350610dfe83610d9a565b8060005b83811015610e2f578151610e168882610db9565b9750610e2183610dd1565b925050600181019050610e02565b5085935050505092915050565b6000604083016000830151610e546000860182610c9e565b5060208301518482036020860152610e6c8282610dde565b9150508091505092915050565b6000610e858383610e3c565b905092915050565b6000602082019050919050565b6000610ea582610d52565b610eaf8185610d5d565b935083602082028501610ec185610d6e565b8060005b85811015610efd5784840389528151610ede8582610e79565b9450610ee983610e8d565b925060208a01995050600181019050610ec5565b50829750879550505050505092915050565b60006020820190508181036000830152610f298184610e9a565b905092915050565b610f3a81610c8c565b8114610f4557600080fd5b50565b600081359050610f5781610f31565b92915050565b600060208284031215610f7357610f72610b80565b5b6000610f8184828501610f48565b91505092915050565b600082825260208201905092915050565b6000610fa682610d7e565b610fb08185610f8a565b9350610fbb83610d9a565b8060005b83811015610fec578151610fd38882610db9565b9750610fde83610dd1565b925050600181019050610fbf565b5085935050505092915050565b600060208201905081810360008301526110138184610f9b565b905092915050565b61102481610c8c565b82525050565b600060208201905061103f600083018461101b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006110e7826110d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611119576111186110a3565b5b600182019050919050565b600061ffff82169050919050565b600061113d82611124565b915061ffff8203611151576111506110a3565b5b60018201905091905056fea26469706673582212205c053a6aca0e3afd0670d8fcb75d1d8b13d6855959717556618dd57c0974c04464736f6c63430008110033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100575760003560e01c806301ffc9a71461005c57806352ef6b2c1461008c5780637a0ed627146100aa578063adfca15e146100c8578063cdffacc6146100f8575b600080fd5b61007660048036038101906100719190610bdd565b610128565b6040516100839190610c25565b60405180910390f35b61009461019e565b6040516100a19190610d30565b60405180910390f35b6100b26103cc565b6040516100bf9190610f0f565b60405180910390f35b6100e260048036038101906100dd9190610f5d565b6108aa565b6040516100ef9190610ff9565b60405180910390f35b610112600480360381019061010d9190610bdd565b610a97565b60405161011f919061102a565b60405180910390f35b600080610133610b23565b9050806002016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16915050919050565b606060006101aa610b23565b90506000816001018054905090508067ffffffffffffffff8111156101d2576101d1611045565b5b6040519080825280602002602001820160405280156102005781602001602082028036833780820191505090505b5092506000805b828110156103c257600084600101828154811061022757610226611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b8581101561033c578881815181106102e6576102e5611074565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610329576001915061033c565b8080610334906110dc565b9150506102cb565b50801561034f57600090505050506103af565b8188868151811061036357610362611074565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084806103a8906110dc565b9550505050505b80806103ba906110dc565b915050610207565b5080845250505090565b606060006103d8610b23565b90506000816001018054905090508067ffffffffffffffff811115610400576103ff611045565b5b60405190808252806020026020018201604052801561043957816020015b610426610b50565b81526020019060019003908161041e5790505b50925060008167ffffffffffffffff81111561045857610457611045565b5b6040519080825280602002602001820160405280156104865781602001602082028036833780820191505090505b5090506000805b838110156108355760008560010182815481106104ad576104ac611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000805b85811015610696578273ffffffffffffffffffffffffffffffffffffffff168a828151811061058357610582611074565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361068357838a82815181106105be576105bd611074565b5b6020026020010151602001518883815181106105dd576105dc611074565b5b602002602001015161ffff16815181106105fa576105f9611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505086818151811061065957610658611074565b5b60200260200101805180919061066e90611132565b61ffff1661ffff168152505060019150610696565b808061068e906110dc565b915050610551565b5080156106a95760009050505050610822565b818986815181106106bd576106bc611074565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508667ffffffffffffffff81111561071557610714611045565b5b6040519080825280602002602001820160405280156107435781602001602082028036833780820191505090505b5089868151811061075757610756611074565b5b6020026020010151602001819052508289868151811061077a57610779611074565b5b60200260200101516020015160008151811061079957610798611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060018686815181106107fa576107f9611074565b5b602002602001019061ffff16908161ffff1681525050848061081b906110dc565b9550505050505b808061082d906110dc565b91505061048d565b5060005b8181101561089f57600083828151811061085657610855611074565b5b602002602001015161ffff169050600087838151811061087957610878611074565b5b602002602001015160200151905081815250508080610897906110dc565b915050610839565b508085525050505090565b606060006108b6610b23565b905060008160010180549050905060008167ffffffffffffffff8111156108e0576108df611045565b5b60405190808252806020026020018201604052801561090e5781602001602082028036833780820191505090505b50935060005b82811015610a8b57600084600101828154811061093457610933611074565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603610a765781878581518110610a1b57610a1a611074565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250508380610a72906110dc565b9450505b50508080610a83906110dc565b915050610914565b50808452505050919050565b600080610aa2610b23565b9050806000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610bba81610b85565b8114610bc557600080fd5b50565b600081359050610bd781610bb1565b92915050565b600060208284031215610bf357610bf2610b80565b5b6000610c0184828501610bc8565b91505092915050565b60008115159050919050565b610c1f81610c0a565b82525050565b6000602082019050610c3a6000830184610c16565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c9782610c6c565b9050919050565b610ca781610c8c565b82525050565b6000610cb98383610c9e565b60208301905092915050565b6000602082019050919050565b6000610cdd82610c40565b610ce78185610c4b565b9350610cf283610c5c565b8060005b83811015610d23578151610d0a8882610cad565b9750610d1583610cc5565b925050600181019050610cf6565b5085935050505092915050565b60006020820190508181036000830152610d4a8184610cd2565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610db381610b85565b82525050565b6000610dc58383610daa565b60208301905092915050565b6000602082019050919050565b6000610de982610d7e565b610df38185610d89565b9350610dfe83610d9a565b8060005b83811015610e2f578151610e168882610db9565b9750610e2183610dd1565b925050600181019050610e02565b5085935050505092915050565b6000604083016000830151610e546000860182610c9e565b5060208301518482036020860152610e6c8282610dde565b9150508091505092915050565b6000610e858383610e3c565b905092915050565b6000602082019050919050565b6000610ea582610d52565b610eaf8185610d5d565b935083602082028501610ec185610d6e565b8060005b85811015610efd5784840389528151610ede8582610e79565b9450610ee983610e8d565b925060208a01995050600181019050610ec5565b50829750879550505050505092915050565b60006020820190508181036000830152610f298184610e9a565b905092915050565b610f3a81610c8c565b8114610f4557600080fd5b50565b600081359050610f5781610f31565b92915050565b600060208284031215610f7357610f72610b80565b5b6000610f8184828501610f48565b91505092915050565b600082825260208201905092915050565b6000610fa682610d7e565b610fb08185610f8a565b9350610fbb83610d9a565b8060005b83811015610fec578151610fd38882610db9565b9750610fde83610dd1565b925050600181019050610fbf565b5085935050505092915050565b600060208201905081810360008301526110138184610f9b565b905092915050565b61102481610c8c565b82525050565b600060208201905061103f600083018461101b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006110e7826110d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611119576111186110a3565b5b600182019050919050565b600061ffff82169050919050565b600061113d82611124565b915061ffff8203611151576111506110a3565b5b60018201905091905056fea26469706673582212205c053a6aca0e3afd0670d8fcb75d1d8b13d6855959717556618dd57c0974c04464736f6c63430008110033