ETH Price: $4,012.02 (+1.48%)
Gas: 8.99 Gwei

Contract

0x44dC42076ECa1b8E35B222a54b04daa333cE1F63
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
149625402022-06-14 15:58:18916 days ago1655222298
0x44dC4207...333cE1F63
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PausableZoneController

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 19066 runs

Other Settings:
default evmVersion
File 1 of 10 : PausableZoneController.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;
import { PausableZone } from "./PausableZone.sol";

// prettier-ignore
import {
    PausableZoneControllerInterface
} from "./interfaces/PausableZoneControllerInterface.sol";

// prettier-ignore
import {
    PausableZoneEventsAndErrors
} from "./interfaces/PausableZoneEventsAndErrors.sol";

// prettier-ignore
import {
    Order,
    Fulfillment,
    OrderComponents,
    AdvancedOrder,
    CriteriaResolver,
    Execution
} from "../lib/ConsiderationStructs.sol";

import { SeaportInterface } from "../interfaces/SeaportInterface.sol";

/**
 * @title  PausableZoneController
 * @author cupOJoseph, BCLeFevre, stuckinaboot, stephankmin
 * @notice PausableZoneController enables deploying, pausing and executing
 *         orders on PausableZones. This deployer is designed to be owned
 *         by a gnosis safe, DAO, or trusted party.
 */
contract PausableZoneController is
    PausableZoneControllerInterface,
    PausableZoneEventsAndErrors
{
    // Set the owner that can deploy, pause and execute orders on PausableZones.
    address internal _owner;

    // Set the address of the new potential owner of the zone.
    address private _potentialOwner;

    // Set the address with the ability to pause the zone.
    address internal _pauser;

    // Set the immutable zone creation code hash.
    bytes32 public immutable zoneCreationCode;

    /**
     * @dev Throws if called by any account other than the owner or pauser.
     */
    modifier isPauser() {
        if (msg.sender != _pauser && msg.sender != _owner) {
            revert InvalidPauser();
        }
        _;
    }

    /**
     * @notice Set the owner of the controller and store
     *         the zone creation code.
     *
     * @param ownerAddress The deployer to be set as the owner.
     */
    constructor(address ownerAddress) {
        // Set the owner address as the owner.
        _owner = ownerAddress;

        // Hash and store the zone creation code.
        zoneCreationCode = keccak256(type(PausableZone).creationCode);
    }

    /**
     * @notice Deploy a PausableZone to a precomputed address.
     *
     * @param salt The salt to be used to derive the zone address
     *
     * @return derivedAddress The derived address for the zone.
     */
    function createZone(bytes32 salt)
        external
        override
        returns (address derivedAddress)
    {
        // Ensure the caller is the owner.
        require(
            msg.sender == _owner,
            "Only owner can create new Zones from here."
        );

        // Derive the PausableZone address.
        // This expression demonstrates address computation but is not required.
        derivedAddress = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            bytes1(0xff),
                            address(this),
                            salt,
                            zoneCreationCode
                        )
                    )
                )
            )
        );

        // Revert if a zone is currently deployed to the derived address.
        if (derivedAddress.code.length != 0) {
            revert ZoneAlreadyExists(derivedAddress);
        }

        // Deploy the zone using the supplied salt.
        new PausableZone{ salt: salt }();

        // Emit an event signifying that the zone was created.
        emit ZoneCreated(derivedAddress, salt);
    }

    /**
     * @notice Pause orders on a given zone.
     *
     * @param zone The address of the zone to be paused.
     *
     * @return success A boolean indicating the zone has been paused.
     */
    function pause(address zone)
        external
        override
        isPauser
        returns (bool success)
    {
        // Call pause on the given zone.
        PausableZone(zone).pause();

        // Return a boolean indicating the pause was successful.
        success = true;
    }

    /**
     * @notice Cancel Seaport orders on a given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to cancel.
     */
    function cancelOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        OrderComponents[] calldata orders
    ) external override {
        // Ensure the caller is the owner.
        require(
            msg.sender == _owner,
            "Only the owner can cancel orders with the zone."
        );

        // Create a zone object from the zone address.
        PausableZone zone = PausableZone(pausableZoneAddress);

        // Call cancelOrders on the given zone.
        zone.cancelOrders(seaportAddress, orders);
    }

    /**
     * @notice Execute an arbitrary number of matched orders on a given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to match.
     * @param fulfillments        An array of elements allocating offer components
     *                            to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        Order[] calldata orders,
        Fulfillment[] calldata fulfillments
    ) external payable override returns (Execution[] memory executions) {
        // Ensure the caller is the owner.
        require(
            msg.sender == _owner,
            "Only the owner can execute orders with the zone."
        );

        // Create a zone object from the zone address.
        PausableZone zone = PausableZone(pausableZoneAddress);

        // Call executeMatchOrders on the given zone and return the sequence
        // of transfers performed as part of matching the given orders.
        executions = zone.executeMatchOrders{ value: msg.value }(
            seaportAddress,
            orders,
            fulfillments
        );
    }

    /**
     * @notice Execute an arbitrary number of matched advanced orders on a given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to match.
     * @param criteriaResolvers   An array where each element contains a reference
     *                            to a specific order as well as that order's
     *                            offer or consideration, a token identifier, and
     *                            a proof that the supplied token identifier is
     *                            contained in the order's merkle root.
     * @param fulfillments        An array of elements allocating offer components
     *                            to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchAdvancedOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        AdvancedOrder[] calldata orders,
        CriteriaResolver[] calldata criteriaResolvers,
        Fulfillment[] calldata fulfillments
    ) external payable override returns (Execution[] memory executions) {
        // Ensure the caller is the owner.
        require(
            msg.sender == _owner,
            "Only the owner can execute advanced orders with the zone."
        );

        // Create a zone object from the zone address.
        PausableZone zone = PausableZone(pausableZoneAddress);

        // Call executeMatchOrders on the given zone and return the sequence
        // of transfers performed as part of matching the given orders.
        executions = zone.executeMatchAdvancedOrders{ value: msg.value }(
            seaportAddress,
            orders,
            criteriaResolvers,
            fulfillments
        );
    }

    /**
     * @notice Initiate Zone ownership transfer by assigning a new potential
     *         owner this contract. Once set, the new potential owner
     *         may call `acceptOwnership` to claim ownership.
     *         Only the owner in question may call this function.
     *
     * @param newPotentialOwner The address for which to initiate ownership
     *                          transfer to.
     */
    function transferOwnership(address newPotentialOwner) external override {
        // Ensure the caller is the owner.
        require(msg.sender == _owner, "Only Owner can transfer Ownership.");

        // Ensure the new potential owner is not an invalid address.
        require(
            newPotentialOwner != address(0),
            "New Owner can not be 0 address."
        );

        // Emit an event indicating that the potential owner has been updated.
        emit PotentialOwnerUpdated(newPotentialOwner);

        // Set the new potential owner as the potential owner.
        _potentialOwner = newPotentialOwner;
    }

    /**
     * @notice Clear the currently set potential owner, if any.
     *         Only the owner of this contract may call this function.
     */
    function cancelOwnershipTransfer() external override {
        // Ensure the caller is the current owner.
        require(msg.sender == _owner, "Only Owner can cancel.");

        // Emit an event indicating that the potential owner has been cleared.
        emit PotentialOwnerUpdated(address(0));

        // Clear the current new potential owner.
        delete _potentialOwner;
    }

    /**
     * @notice Accept ownership of this contract. Only the account that the
     *         current owner has set as the new potential owner may call this
     *         function.
     */
    function acceptOwnership() external override {
        // Ensure the caller is the potential owner.
        require(
            msg.sender == _potentialOwner,
            "Only Potential Owner can claim."
        );

        // Emit an event indicating that the potential owner has been cleared.
        emit PotentialOwnerUpdated(address(0));

        // Clear the current new potential owner
        delete _potentialOwner;

        // Emit an event indicating ownership has been transferred.
        emit OwnershipTransferred(_owner, msg.sender);

        // Set the caller as the owner of this contract.
        _owner = msg.sender;
    }

    /**
     * @notice Assign the given address with the ability to pause the zone.
     *
     * @param pauserToAssign The address to assign the pauser role.
     */
    function assignPauser(address pauserToAssign) external override {
        // Ensure the caller is the owner.
        require(msg.sender == _owner, "Can only be set by the deployer");

        // Ensure the pauser to assign is not an invalid address.
        require(
            pauserToAssign != address(0),
            "Pauser can not be set to the null address"
        );

        // Set the given account as the pauser.
        _pauser = pauserToAssign;

        // Emit an event indicating the pauser has been assigned.
        emit PauserUpdated(_pauser);
    }

    /**
     * @notice Assign the given address with the ability to operate the
     *         given zone.
     *
     * @param pausableZoneAddress The zone address to assign operator role.
     * @param operatorToAssign    The address to assign as operator.
     */
    function assignOperator(
        address pausableZoneAddress,
        address operatorToAssign
    ) external override {
        // Ensure the caller is the owner.
        require(msg.sender == _owner, "Can only be set by the deployer");

        // Create a zone object from the zone address.
        PausableZone zone = PausableZone(pausableZoneAddress);

        // Call assignOperator on the zone by passing in the given operator address.
        zone.assignOperator(operatorToAssign);
    }

    /**
     * @notice An external view function that returns the owner.
     *
     * @return The address of the owner.
     */
    function owner() external view override returns (address) {
        return _owner;
    }

    /**
     * @notice An external view function that return the potential owner.
     *
     * @return The address of the potential owner.
     */
    function potentialOwner() external view override returns (address) {
        return _potentialOwner;
    }

    /**
     * @notice An external view function that returns the pauser.
     *
     * @return The address of the pauser.
     */
    function pauser() external view override returns (address) {
        return _pauser;
    }
}

File 2 of 10 : PausableZone.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

import { ZoneInterface } from "../interfaces/ZoneInterface.sol";
import { ZoneInteractionErrors } from "../interfaces/ZoneInteractionErrors.sol";

// prettier-ignore
import {
    PausableZoneEventsAndErrors
} from "./interfaces/PausableZoneEventsAndErrors.sol";

import { SeaportInterface } from "../interfaces/SeaportInterface.sol";

// prettier-ignore
import {
    AdvancedOrder,
    CriteriaResolver,
    Order,
    OrderComponents,
    Fulfillment,
    Execution
} from "../lib/ConsiderationStructs.sol";

import { PausableZoneInterface } from "./interfaces/PausableZoneInterface.sol";

/**
 * @title  PausableZone
 * @author cupOJoseph, BCLeFevre, ryanio
 * @notice PausableZone is a simple zone implementation that approves every
 *         order. It can be self-destructed by its controller to pause
 *         restricted orders that have it set as their zone.
 */
contract PausableZone is
    PausableZoneEventsAndErrors,
    ZoneInterface,
    PausableZoneInterface
{
    // Set an immutable controller that can pause the zone & update an operator.
    address internal immutable _controller;

    // Set an operator that can instruct the zone to cancel or execute orders.
    address public operator;

    /**
     * @dev Ensure that the caller is either the operator or controller.
     */
    modifier isOperator() {
        // Ensure that the caller is either the operator or the controller.
        if (msg.sender != operator && msg.sender != _controller) {
            revert InvalidOperator();
        }

        // Continue with function execution.
        _;
    }

    /**
     * @dev Ensure that the caller is the controller.
     */
    modifier isController() {
        // Ensure that the caller is the controller.
        if (msg.sender != _controller) {
            revert InvalidController();
        }

        // Continue with function execution.
        _;
    }

    /**
     * @notice Set the deployer as the controller of the zone.
     */
    constructor() {
        // Set the controller to the deployer.
        _controller = msg.sender;

        // Emit an event signifying that the zone is unpaused.
        emit Unpaused();
    }

    /**
     * @notice Check if a given order is currently valid.
     *
     * @dev This function is called by Seaport whenever extraData is not
     *      provided by the caller.
     *
     * @param orderHash The hash of the order.
     * @param caller    The caller in question.
     * @param offerer   The offerer in question.
     * @param zoneHash  The hash to provide upon calling the zone.
     *
     * @return validOrderMagicValue A magic value indicating if the order is
     *                              currently valid.
     */
    function isValidOrder(
        bytes32 orderHash,
        address caller,
        address offerer,
        bytes32 zoneHash
    ) external pure override returns (bytes4 validOrderMagicValue) {
        orderHash;
        caller;
        offerer;
        zoneHash;

        // Return the selector of isValidOrder as the magic value.
        validOrderMagicValue = ZoneInterface.isValidOrder.selector;
    }

    /**
     * @notice Check if a given order including extraData is currently valid.
     *
     * @dev This function is called by Seaport whenever any extraData is
     *      provided by the caller.
     *
     * @param orderHash         The hash of the order.
     * @param caller            The caller in question.
     * @param order             The order in question.
     * @param priorOrderHashes  The order hashes of each order supplied prior to
     *                          the current order as part of a "match" variety
     *                          of order fulfillment.
     * @param criteriaResolvers The criteria resolvers corresponding to
     *                          the order.
     *
     * @return validOrderMagicValue A magic value indicating if the order is
     *                              currently valid.
     */
    function isValidOrderIncludingExtraData(
        bytes32 orderHash,
        address caller,
        AdvancedOrder calldata order,
        bytes32[] calldata priorOrderHashes,
        CriteriaResolver[] calldata criteriaResolvers
    ) external pure override returns (bytes4 validOrderMagicValue) {
        orderHash;
        caller;
        order;
        priorOrderHashes;
        criteriaResolvers;

        // Return the selector of isValidOrder as the magic value.
        validOrderMagicValue = ZoneInterface.isValidOrder.selector;
    }

    /**
     * @notice Cancel an arbitrary number of orders that have agreed to use the
     *         contract as their zone.
     *
     * @param seaport  The Seaport address.
     * @param orders   The orders to cancel.
     *
     * @return cancelled A boolean indicating whether the supplied orders have
     *                   been successfully cancelled.
     */
    function cancelOrders(
        SeaportInterface seaport,
        OrderComponents[] calldata orders
    ) external override isOperator returns (bool cancelled) {
        // Call cancel on Seaport and return its boolean value.
        cancelled = seaport.cancel(orders);
    }

    /**
     * @notice Execute an arbitrary number of matched orders, each with
     *         an arbitrary number of items for offer and consideration
     *         along with a set of fulfillments allocating offer components
     *         to consideration components.
     *
     * @param seaport      The Seaport address.
     * @param orders       The orders to match.
     * @param fulfillments An array of elements allocating offer components
     *                     to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchOrders(
        SeaportInterface seaport,
        Order[] calldata orders,
        Fulfillment[] calldata fulfillments
    )
        external
        payable
        override
        isOperator
        returns (Execution[] memory executions)
    {
        // Call matchOrders on Seaport and return the sequence of transfers
        // performed as part of matching the given orders.
        executions = seaport.matchOrders{ value: msg.value }(
            orders,
            fulfillments
        );
    }

    /**
     * @notice Execute an arbitrary number of matched advanced orders,
     *         each with an arbitrary number of items for offer and
     *         consideration along with a set of fulfillments allocating
     *         offer components to consideration components.
     *
     * @param seaport           The Seaport address.
     * @param orders            The orders to match.
     * @param criteriaResolvers An array where each element contains a reference
     *                          to a specific order as well as that order's
     *                          offer or consideration, a token identifier, and
     *                          a proof that the supplied token identifier is
     *                          contained in the order's merkle root.
     * @param fulfillments      An array of elements allocating offer components
     *                          to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchAdvancedOrders(
        SeaportInterface seaport,
        AdvancedOrder[] calldata orders,
        CriteriaResolver[] calldata criteriaResolvers,
        Fulfillment[] calldata fulfillments
    )
        external
        payable
        override
        isOperator
        returns (Execution[] memory executions)
    {
        // Call matchAdvancedOrders on Seaport and return the sequence of
        // transfers performed as part of matching the given orders.
        executions = seaport.matchAdvancedOrders{ value: msg.value }(
            orders,
            criteriaResolvers,
            fulfillments
        );
    }

    /**
     * @notice Pause this contract, safely stopping orders from using
     *         the contract as a zone. Restricted orders with this address as a
     *         zone will not be fulfillable unless the zone is redeployed to the
     *         same address.
     */
    function pause() external override isController {
        // Emit an event signifying that the zone is paused.
        emit Paused();

        // Destroy the zone, sending any ether to the transaction submitter.
        selfdestruct(payable(tx.origin));
    }

    /**
     * @notice Assign the given address with the ability to operate the zone.
     *
     * @param operatorToAssign The address to assign as the operator.
     */
    function assignOperator(address operatorToAssign)
        external
        override
        isController
    {
        // Ensure the operator being assigned is not the null address.
        require(
            operatorToAssign != address(0),
            "Operator can not be set to the null address"
        );

        // Set the given address as the new operator.
        operator = operatorToAssign;

        // Emit an event indicating the operator has been updated.
        emit OperatorUpdated(operator);
    }
}

File 3 of 10 : PausableZoneControllerInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;
import { PausableZone } from "../PausableZone.sol";

// prettier-ignore
import {
    PausableZoneEventsAndErrors
} from "./PausableZoneEventsAndErrors.sol";

// prettier-ignore
import {
    Order,
    Fulfillment,
    OrderComponents,
    AdvancedOrder,
    CriteriaResolver,
    Execution
} from "../../lib/ConsiderationStructs.sol";

import { SeaportInterface } from "../../interfaces/SeaportInterface.sol";

/**
 * @title  PausableZoneController
 * @author cupOJoseph, BCLeFevre, stuckinaboot
 * @notice PausableZoneController enables deploying, pausing and executing
 *         orders on PausableZones. This deployer is designed to be owned
 *         by a gnosis safe, DAO, or trusted party.
 */
interface PausableZoneControllerInterface {
    /**
     * @notice Deploy a PausableZone to a precomputed address.
     *
     * @param salt The salt to be used to derive the zone address
     *
     * @return derivedAddress The derived address for the zone.
     */
    function createZone(bytes32 salt) external returns (address derivedAddress);

    /**
     * @notice Pause orders on a given zone.
     *
     * @param zone The address of the zone to be paused.
     *
     * @return success A boolean indicating the zone has been paused.
     */
    function pause(address zone) external returns (bool success);

    /**
     * @notice Cancel Seaport offers on a given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be
     *                            cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to cancel.
     */
    function cancelOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        OrderComponents[] calldata orders
    ) external;

    /**
     * @notice Execute an arbitrary number of matched orders on a given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be
     *                            cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to match.
     * @param fulfillments        An array of elements allocating offer components
     *                            to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        Order[] calldata orders,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Execute an arbitrary number of matched advanced orders on a
     *         given zone.
     *
     * @param pausableZoneAddress The zone that manages the orders to be
     *                            cancelled.
     * @param seaportAddress      The Seaport address.
     * @param orders              The orders to match.
     * @param criteriaResolvers   An array where each element contains a
     *                            reference to a specific order as well as
     *                            that order's offer or consideration,
     *                            a token identifier, and a proof that
     *                            the supplied token identifier is
     *                            contained in the order's merkle root.
     * @param fulfillments        An array of elements allocating offer
     *                            components to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchAdvancedOrders(
        address pausableZoneAddress,
        SeaportInterface seaportAddress,
        AdvancedOrder[] calldata orders,
        CriteriaResolver[] calldata criteriaResolvers,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Initiate Zone ownership transfer by assigning a new potential
     *         owner this contract. Once set, the new potential owner
     *         may call `acceptOwnership` to claim ownership.
     *         Only the owner in question may call this function.
     *
     * @param newPotentialOwner The address for which to initiate ownership
     *                          transfer to.
     */
    function transferOwnership(address newPotentialOwner) external;

    /**
     * @notice Clear the currently set potential owner, if any.
     *         Only the owner of this contract may call this function.
     */
    function cancelOwnershipTransfer() external;

    /**
     * @notice Accept ownership of this contract. Only the account that the
     *         current owner has set as the new potential owner may call this
     *         function.
     */
    function acceptOwnership() external;

    /**
     * @notice Assign the given address with the ability to pause the zone.
     *
     * @param pauserToAssign The address to assign the pauser role.
     */
    function assignPauser(address pauserToAssign) external;

    /**
     * @notice Assign the given address with the ability to operate the
     *         given zone.
     *
     * @param pausableZoneAddress The zone address to assign operator role.
     * @param operatorToAssign    The address to assign as operator.
     */
    function assignOperator(
        address pausableZoneAddress,
        address operatorToAssign
    ) external;

    /**
     * @notice An external view function that returns the owner.
     *
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * @notice An external view function that return the potential owner.
     *
     * @return The address of the potential owner.
     */
    function potentialOwner() external view returns (address);

    /**
     * @notice An external view function that returns the pauser.
     *
     * @return The address of the pauser.
     */
    function pauser() external view returns (address);
}

File 4 of 10 : PausableZoneEventsAndErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

/**
 * @notice PausableZoneEventsAndErrors contains errors and events
 *         related to zone interaction.
 */
interface PausableZoneEventsAndErrors {
    /**
     * @dev Emit an event whenever a zone owner registers a new potential
     *      owner for that zone.
     *
     * @param newPotentialOwner The new potential owner of the zone.
     */
    event PotentialOwnerUpdated(address newPotentialOwner);

    /**
     * @dev Emit an event whenever zone ownership is transferred.
     *
     * @param previousOwner The previous owner of the zone.
     * @param newOwner      The new owner of the zone.
     */
    event OwnershipTransferred(address previousOwner, address newOwner);

    /**
     * @dev Emit an event whenever a new zone is created.
     *
     * @param zone The address of the zone.
     * @param salt The salt used to deploy the zone.
     */
    event ZoneCreated(address zone, bytes32 salt);

    /**
     * @dev Emit an event whenever a zone owner assigns a new pauser
     *
     * @param newPauser The new pausear of the zone.
     */
    event PauserUpdated(address newPauser);

    /**
     * @dev Emit an event whenever a zone owner assigns a new operator
     *
     * @param newOperator The new operator of the zone.
     */
    event OperatorUpdated(address newOperator);

    /**
     * @dev Revert with an error when attempting to pause the zone
     *      while the caller is not the owner or pauser of the zone.
     */
    error InvalidPauser();

    /**
     * @dev Revert with an error when attempting to call an operation
     *      while the caller is not the controller or operator of the zone.
     */
    error InvalidOperator();

    /**
     * @dev Revert with an error when attempting to pause the zone or update the
     *      operator while the caller is not the controller of the zone.
     */
    error InvalidController();
    /**
     * @dev Revert with an error when attempting to deploy a zone that is
     *      currently deployed.
     */
    error ZoneAlreadyExists(address zone);
}

File 5 of 10 : ConsiderationStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

// prettier-ignore
import {
    OrderType,
    BasicOrderType,
    ItemType,
    Side
} from "./ConsiderationEnums.sol";

/**
 * @dev An order contains eleven components: an offerer, a zone (or account that
 *      can cancel the order or restrict who can fulfill the order depending on
 *      the type), the order type (specifying partial fill support as well as
 *      restricted order status), the start and end time, a hash that will be
 *      provided to the zone when validating restricted orders, a salt, a key
 *      corresponding to a given conduit, a counter, and an arbitrary number of
 *      offer items that can be spent along with consideration items that must
 *      be received by their respective recipient.
 */
struct OrderComponents {
    address offerer;
    address zone;
    OfferItem[] offer;
    ConsiderationItem[] consideration;
    OrderType orderType;
    uint256 startTime;
    uint256 endTime;
    bytes32 zoneHash;
    uint256 salt;
    bytes32 conduitKey;
    uint256 counter;
}

/**
 * @dev An offer item has five components: an item type (ETH or other native
 *      tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and
 *      ERC1155), a token address, a dual-purpose "identifierOrCriteria"
 *      component that will either represent a tokenId or a merkle root
 *      depending on the item type, and a start and end amount that support
 *      increasing or decreasing amounts over the duration of the respective
 *      order.
 */
struct OfferItem {
    ItemType itemType;
    address token;
    uint256 identifierOrCriteria;
    uint256 startAmount;
    uint256 endAmount;
}

/**
 * @dev A consideration item has the same five components as an offer item and
 *      an additional sixth component designating the required recipient of the
 *      item.
 */
struct ConsiderationItem {
    ItemType itemType;
    address token;
    uint256 identifierOrCriteria;
    uint256 startAmount;
    uint256 endAmount;
    address payable recipient;
}

/**
 * @dev A spent item is translated from a utilized offer item and has four
 *      components: an item type (ETH or other native tokens, ERC20, ERC721, and
 *      ERC1155), a token address, a tokenId, and an amount.
 */
struct SpentItem {
    ItemType itemType;
    address token;
    uint256 identifier;
    uint256 amount;
}

/**
 * @dev A received item is translated from a utilized consideration item and has
 *      the same four components as a spent item, as well as an additional fifth
 *      component designating the required recipient of the item.
 */
struct ReceivedItem {
    ItemType itemType;
    address token;
    uint256 identifier;
    uint256 amount;
    address payable recipient;
}

/**
 * @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155
 *      matching, a group of six functions may be called that only requires a
 *      subset of the usual order arguments. Note the use of a "basicOrderType"
 *      enum; this represents both the usual order type as well as the "route"
 *      of the basic order (a simple derivation function for the basic order
 *      type is `basicOrderType = orderType + (4 * basicOrderRoute)`.)
 */
struct BasicOrderParameters {
    // calldata offset
    address considerationToken; // 0x24
    uint256 considerationIdentifier; // 0x44
    uint256 considerationAmount; // 0x64
    address payable offerer; // 0x84
    address zone; // 0xa4
    address offerToken; // 0xc4
    uint256 offerIdentifier; // 0xe4
    uint256 offerAmount; // 0x104
    BasicOrderType basicOrderType; // 0x124
    uint256 startTime; // 0x144
    uint256 endTime; // 0x164
    bytes32 zoneHash; // 0x184
    uint256 salt; // 0x1a4
    bytes32 offererConduitKey; // 0x1c4
    bytes32 fulfillerConduitKey; // 0x1e4
    uint256 totalOriginalAdditionalRecipients; // 0x204
    AdditionalRecipient[] additionalRecipients; // 0x224
    bytes signature; // 0x244
    // Total length, excluding dynamic array data: 0x264 (580)
}

/**
 * @dev Basic orders can supply any number of additional recipients, with the
 *      implied assumption that they are supplied from the offered ETH (or other
 *      native token) or ERC20 token for the order.
 */
struct AdditionalRecipient {
    uint256 amount;
    address payable recipient;
}

/**
 * @dev The full set of order components, with the exception of the counter,
 *      must be supplied when fulfilling more sophisticated orders or groups of
 *      orders. The total number of original consideration items must also be
 *      supplied, as the caller may specify additional consideration items.
 */
struct OrderParameters {
    address offerer; // 0x00
    address zone; // 0x20
    OfferItem[] offer; // 0x40
    ConsiderationItem[] consideration; // 0x60
    OrderType orderType; // 0x80
    uint256 startTime; // 0xa0
    uint256 endTime; // 0xc0
    bytes32 zoneHash; // 0xe0
    uint256 salt; // 0x100
    bytes32 conduitKey; // 0x120
    uint256 totalOriginalConsiderationItems; // 0x140
    // offer.length                          // 0x160
}

/**
 * @dev Orders require a signature in addition to the other order parameters.
 */
struct Order {
    OrderParameters parameters;
    bytes signature;
}

/**
 * @dev Advanced orders include a numerator (i.e. a fraction to attempt to fill)
 *      and a denominator (the total size of the order) in addition to the
 *      signature and other order parameters. It also supports an optional field
 *      for supplying extra data; this data will be included in a staticcall to
 *      `isValidOrderIncludingExtraData` on the zone for the order if the order
 *      type is restricted and the offerer or zone are not the caller.
 */
struct AdvancedOrder {
    OrderParameters parameters;
    uint120 numerator;
    uint120 denominator;
    bytes signature;
    bytes extraData;
}

/**
 * @dev Orders can be validated (either explicitly via `validate`, or as a
 *      consequence of a full or partial fill), specifically cancelled (they can
 *      also be cancelled in bulk via incrementing a per-zone counter), and
 *      partially or fully filled (with the fraction filled represented by a
 *      numerator and denominator).
 */
struct OrderStatus {
    bool isValidated;
    bool isCancelled;
    uint120 numerator;
    uint120 denominator;
}

/**
 * @dev A criteria resolver specifies an order, side (offer vs. consideration),
 *      and item index. It then provides a chosen identifier (i.e. tokenId)
 *      alongside a merkle proof demonstrating the identifier meets the required
 *      criteria.
 */
struct CriteriaResolver {
    uint256 orderIndex;
    Side side;
    uint256 index;
    uint256 identifier;
    bytes32[] criteriaProof;
}

/**
 * @dev A fulfillment is applied to a group of orders. It decrements a series of
 *      offer and consideration items, then generates a single execution
 *      element. A given fulfillment can be applied to as many offer and
 *      consideration items as desired, but must contain at least one offer and
 *      at least one consideration that match. The fulfillment must also remain
 *      consistent on all key parameters across all offer items (same offerer,
 *      token, type, tokenId, and conduit preference) as well as across all
 *      consideration items (token, type, tokenId, and recipient).
 */
struct Fulfillment {
    FulfillmentComponent[] offerComponents;
    FulfillmentComponent[] considerationComponents;
}

/**
 * @dev Each fulfillment component contains one index referencing a specific
 *      order and another referencing a specific offer or consideration item.
 */
struct FulfillmentComponent {
    uint256 orderIndex;
    uint256 itemIndex;
}

/**
 * @dev An execution is triggered once all consideration items have been zeroed
 *      out. It sends the item in question from the offerer to the item's
 *      recipient, optionally sourcing approvals from either this contract
 *      directly or from the offerer's chosen conduit if one is specified. An
 *      execution is not provided as an argument, but rather is derived via
 *      orders, criteria resolvers, and fulfillments (where the total number of
 *      executions will be less than or equal to the total number of indicated
 *      fulfillments) and returned as part of `matchOrders`.
 */
struct Execution {
    ReceivedItem item;
    address offerer;
    bytes32 conduitKey;
}

File 6 of 10 : SeaportInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

// prettier-ignore
import {
    BasicOrderParameters,
    OrderComponents,
    Fulfillment,
    FulfillmentComponent,
    Execution,
    Order,
    AdvancedOrder,
    OrderStatus,
    CriteriaResolver
} from "../lib/ConsiderationStructs.sol";

/**
 * @title SeaportInterface
 * @author 0age
 * @custom:version 1.1
 * @notice Seaport is a generalized ETH/ERC20/ERC721/ERC1155 marketplace. It
 *         minimizes external calls to the greatest extent possible and provides
 *         lightweight methods for common routes as well as more flexible
 *         methods for composing advanced orders.
 *
 * @dev SeaportInterface contains all external function interfaces for Seaport.
 */
interface SeaportInterface {
    /**
     * @notice Fulfill an order offering an ERC721 token by supplying Ether (or
     *         the native token for the given chain) as consideration for the
     *         order. An arbitrary number of "additional recipients" may also be
     *         supplied which will each receive native tokens from the fulfiller
     *         as consideration.
     *
     * @param parameters Additional information on the fulfilled order. Note
     *                   that the offerer must first approve this contract (or
     *                   their preferred conduit if indicated by the order) for
     *                   their offered ERC721 token to be transferred.
     *
     * @return fulfilled A boolean indicating whether the order has been
     *                   successfully fulfilled.
     */
    function fulfillBasicOrder(BasicOrderParameters calldata parameters)
        external
        payable
        returns (bool fulfilled);

    /**
     * @notice Fulfill an order with an arbitrary number of items for offer and
     *         consideration. Note that this function does not support
     *         criteria-based orders or partial filling of orders (though
     *         filling the remainder of a partially-filled order is supported).
     *
     * @param order               The order to fulfill. Note that both the
     *                            offerer and the fulfiller must first approve
     *                            this contract (or the corresponding conduit if
     *                            indicated) to transfer any relevant tokens on
     *                            their behalf and that contracts must implement
     *                            `onERC1155Received` to receive ERC1155 tokens
     *                            as consideration.
     * @param fulfillerConduitKey A bytes32 value indicating what conduit, if
     *                            any, to source the fulfiller's token approvals
     *                            from. The zero hash signifies that no conduit
     *                            should be used, with direct approvals set on
     *                            Seaport.
     *
     * @return fulfilled A boolean indicating whether the order has been
     *                   successfully fulfilled.
     */
    function fulfillOrder(Order calldata order, bytes32 fulfillerConduitKey)
        external
        payable
        returns (bool fulfilled);

    /**
     * @notice Fill an order, fully or partially, with an arbitrary number of
     *         items for offer and consideration alongside criteria resolvers
     *         containing specific token identifiers and associated proofs.
     *
     * @param advancedOrder       The order to fulfill along with the fraction
     *                            of the order to attempt to fill. Note that
     *                            both the offerer and the fulfiller must first
     *                            approve this contract (or their preferred
     *                            conduit if indicated by the order) to transfer
     *                            any relevant tokens on their behalf and that
     *                            contracts must implement `onERC1155Received`
     *                            to receive ERC1155 tokens as consideration.
     *                            Also note that all offer and consideration
     *                            components must have no remainder after
     *                            multiplication of the respective amount with
     *                            the supplied fraction for the partial fill to
     *                            be considered valid.
     * @param criteriaResolvers   An array where each element contains a
     *                            reference to a specific offer or
     *                            consideration, a token identifier, and a proof
     *                            that the supplied token identifier is
     *                            contained in the merkle root held by the item
     *                            in question's criteria element. Note that an
     *                            empty criteria indicates that any
     *                            (transferable) token identifier on the token
     *                            in question is valid and that no associated
     *                            proof needs to be supplied.
     * @param fulfillerConduitKey A bytes32 value indicating what conduit, if
     *                            any, to source the fulfiller's token approvals
     *                            from. The zero hash signifies that no conduit
     *                            should be used, with direct approvals set on
     *                            Seaport.
     * @param recipient           The intended recipient for all received items,
     *                            with `address(0)` indicating that the caller
     *                            should receive the items.
     *
     * @return fulfilled A boolean indicating whether the order has been
     *                   successfully fulfilled.
     */
    function fulfillAdvancedOrder(
        AdvancedOrder calldata advancedOrder,
        CriteriaResolver[] calldata criteriaResolvers,
        bytes32 fulfillerConduitKey,
        address recipient
    ) external payable returns (bool fulfilled);

    /**
     * @notice Attempt to fill a group of orders, each with an arbitrary number
     *         of items for offer and consideration. Any order that is not
     *         currently active, has already been fully filled, or has been
     *         cancelled will be omitted. Remaining offer and consideration
     *         items will then be aggregated where possible as indicated by the
     *         supplied offer and consideration component arrays and aggregated
     *         items will be transferred to the fulfiller or to each intended
     *         recipient, respectively. Note that a failing item transfer or an
     *         issue with order formatting will cause the entire batch to fail.
     *         Note that this function does not support criteria-based orders or
     *         partial filling of orders (though filling the remainder of a
     *         partially-filled order is supported).
     *
     * @param orders                    The orders to fulfill. Note that both
     *                                  the offerer and the fulfiller must first
     *                                  approve this contract (or the
     *                                  corresponding conduit if indicated) to
     *                                  transfer any relevant tokens on their
     *                                  behalf and that contracts must implement
     *                                  `onERC1155Received` to receive ERC1155
     *                                  tokens as consideration.
     * @param offerFulfillments         An array of FulfillmentComponent arrays
     *                                  indicating which offer items to attempt
     *                                  to aggregate when preparing executions.
     * @param considerationFulfillments An array of FulfillmentComponent arrays
     *                                  indicating which consideration items to
     *                                  attempt to aggregate when preparing
     *                                  executions.
     * @param fulfillerConduitKey       A bytes32 value indicating what conduit,
     *                                  if any, to source the fulfiller's token
     *                                  approvals from. The zero hash signifies
     *                                  that no conduit should be used, with
     *                                  direct approvals set on this contract.
     * @param maximumFulfilled          The maximum number of orders to fulfill.
     *
     * @return availableOrders An array of booleans indicating if each order
     *                         with an index corresponding to the index of the
     *                         returned boolean was fulfillable or not.
     * @return executions      An array of elements indicating the sequence of
     *                         transfers performed as part of matching the given
     *                         orders.
     */
    function fulfillAvailableOrders(
        Order[] calldata orders,
        FulfillmentComponent[][] calldata offerFulfillments,
        FulfillmentComponent[][] calldata considerationFulfillments,
        bytes32 fulfillerConduitKey,
        uint256 maximumFulfilled
    )
        external
        payable
        returns (bool[] memory availableOrders, Execution[] memory executions);

    /**
     * @notice Attempt to fill a group of orders, fully or partially, with an
     *         arbitrary number of items for offer and consideration per order
     *         alongside criteria resolvers containing specific token
     *         identifiers and associated proofs. Any order that is not
     *         currently active, has already been fully filled, or has been
     *         cancelled will be omitted. Remaining offer and consideration
     *         items will then be aggregated where possible as indicated by the
     *         supplied offer and consideration component arrays and aggregated
     *         items will be transferred to the fulfiller or to each intended
     *         recipient, respectively. Note that a failing item transfer or an
     *         issue with order formatting will cause the entire batch to fail.
     *
     * @param advancedOrders            The orders to fulfill along with the
     *                                  fraction of those orders to attempt to
     *                                  fill. Note that both the offerer and the
     *                                  fulfiller must first approve this
     *                                  contract (or their preferred conduit if
     *                                  indicated by the order) to transfer any
     *                                  relevant tokens on their behalf and that
     *                                  contracts must implement
     *                                  `onERC1155Received` to enable receipt of
     *                                  ERC1155 tokens as consideration. Also
     *                                  note that all offer and consideration
     *                                  components must have no remainder after
     *                                  multiplication of the respective amount
     *                                  with the supplied fraction for an
     *                                  order's partial fill amount to be
     *                                  considered valid.
     * @param criteriaResolvers         An array where each element contains a
     *                                  reference to a specific offer or
     *                                  consideration, a token identifier, and a
     *                                  proof that the supplied token identifier
     *                                  is contained in the merkle root held by
     *                                  the item in question's criteria element.
     *                                  Note that an empty criteria indicates
     *                                  that any (transferable) token
     *                                  identifier on the token in question is
     *                                  valid and that no associated proof needs
     *                                  to be supplied.
     * @param offerFulfillments         An array of FulfillmentComponent arrays
     *                                  indicating which offer items to attempt
     *                                  to aggregate when preparing executions.
     * @param considerationFulfillments An array of FulfillmentComponent arrays
     *                                  indicating which consideration items to
     *                                  attempt to aggregate when preparing
     *                                  executions.
     * @param fulfillerConduitKey       A bytes32 value indicating what conduit,
     *                                  if any, to source the fulfiller's token
     *                                  approvals from. The zero hash signifies
     *                                  that no conduit should be used, with
     *                                  direct approvals set on this contract.
     * @param recipient                 The intended recipient for all received
     *                                  items, with `address(0)` indicating that
     *                                  the caller should receive the items.
     * @param maximumFulfilled          The maximum number of orders to fulfill.
     *
     * @return availableOrders An array of booleans indicating if each order
     *                         with an index corresponding to the index of the
     *                         returned boolean was fulfillable or not.
     * @return executions      An array of elements indicating the sequence of
     *                         transfers performed as part of matching the given
     *                         orders.
     */
    function fulfillAvailableAdvancedOrders(
        AdvancedOrder[] calldata advancedOrders,
        CriteriaResolver[] calldata criteriaResolvers,
        FulfillmentComponent[][] calldata offerFulfillments,
        FulfillmentComponent[][] calldata considerationFulfillments,
        bytes32 fulfillerConduitKey,
        address recipient,
        uint256 maximumFulfilled
    )
        external
        payable
        returns (bool[] memory availableOrders, Execution[] memory executions);

    /**
     * @notice Match an arbitrary number of orders, each with an arbitrary
     *         number of items for offer and consideration along with as set of
     *         fulfillments allocating offer components to consideration
     *         components. Note that this function does not support
     *         criteria-based or partial filling of orders (though filling the
     *         remainder of a partially-filled order is supported).
     *
     * @param orders       The orders to match. Note that both the offerer and
     *                     fulfiller on each order must first approve this
     *                     contract (or their conduit if indicated by the order)
     *                     to transfer any relevant tokens on their behalf and
     *                     each consideration recipient must implement
     *                     `onERC1155Received` to enable ERC1155 token receipt.
     * @param fulfillments An array of elements allocating offer components to
     *                     consideration components. Note that each
     *                     consideration component must be fully met for the
     *                     match operation to be valid.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function matchOrders(
        Order[] calldata orders,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Match an arbitrary number of full or partial orders, each with an
     *         arbitrary number of items for offer and consideration, supplying
     *         criteria resolvers containing specific token identifiers and
     *         associated proofs as well as fulfillments allocating offer
     *         components to consideration components.
     *
     * @param orders            The advanced orders to match. Note that both the
     *                          offerer and fulfiller on each order must first
     *                          approve this contract (or a preferred conduit if
     *                          indicated by the order) to transfer any relevant
     *                          tokens on their behalf and each consideration
     *                          recipient must implement `onERC1155Received` in
     *                          order to receive ERC1155 tokens. Also note that
     *                          the offer and consideration components for each
     *                          order must have no remainder after multiplying
     *                          the respective amount with the supplied fraction
     *                          in order for the group of partial fills to be
     *                          considered valid.
     * @param criteriaResolvers An array where each element contains a reference
     *                          to a specific order as well as that order's
     *                          offer or consideration, a token identifier, and
     *                          a proof that the supplied token identifier is
     *                          contained in the order's merkle root. Note that
     *                          an empty root indicates that any (transferable)
     *                          token identifier is valid and that no associated
     *                          proof needs to be supplied.
     * @param fulfillments      An array of elements allocating offer components
     *                          to consideration components. Note that each
     *                          consideration component must be fully met in
     *                          order for the match operation to be valid.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function matchAdvancedOrders(
        AdvancedOrder[] calldata orders,
        CriteriaResolver[] calldata criteriaResolvers,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Cancel an arbitrary number of orders. Note that only the offerer
     *         or the zone of a given order may cancel it. Callers should ensure
     *         that the intended order was cancelled by calling `getOrderStatus`
     *         and confirming that `isCancelled` returns `true`.
     *
     * @param orders The orders to cancel.
     *
     * @return cancelled A boolean indicating whether the supplied orders have
     *                   been successfully cancelled.
     */
    function cancel(OrderComponents[] calldata orders)
        external
        returns (bool cancelled);

    /**
     * @notice Validate an arbitrary number of orders, thereby registering their
     *         signatures as valid and allowing the fulfiller to skip signature
     *         verification on fulfillment. Note that validated orders may still
     *         be unfulfillable due to invalid item amounts or other factors;
     *         callers should determine whether validated orders are fulfillable
     *         by simulating the fulfillment call prior to execution. Also note
     *         that anyone can validate a signed order, but only the offerer can
     *         validate an order without supplying a signature.
     *
     * @param orders The orders to validate.
     *
     * @return validated A boolean indicating whether the supplied orders have
     *                   been successfully validated.
     */
    function validate(Order[] calldata orders)
        external
        returns (bool validated);

    /**
     * @notice Cancel all orders from a given offerer with a given zone in bulk
     *         by incrementing a counter. Note that only the offerer may
     *         increment the counter.
     *
     * @return newCounter The new counter.
     */
    function incrementCounter() external returns (uint256 newCounter);

    /**
     * @notice Retrieve the order hash for a given order.
     *
     * @param order The components of the order.
     *
     * @return orderHash The order hash.
     */
    function getOrderHash(OrderComponents calldata order)
        external
        view
        returns (bytes32 orderHash);

    /**
     * @notice Retrieve the status of a given order by hash, including whether
     *         the order has been cancelled or validated and the fraction of the
     *         order that has been filled.
     *
     * @param orderHash The order hash in question.
     *
     * @return isValidated A boolean indicating whether the order in question
     *                     has been validated (i.e. previously approved or
     *                     partially filled).
     * @return isCancelled A boolean indicating whether the order in question
     *                     has been cancelled.
     * @return totalFilled The total portion of the order that has been filled
     *                     (i.e. the "numerator").
     * @return totalSize   The total size of the order that is either filled or
     *                     unfilled (i.e. the "denominator").
     */
    function getOrderStatus(bytes32 orderHash)
        external
        view
        returns (
            bool isValidated,
            bool isCancelled,
            uint256 totalFilled,
            uint256 totalSize
        );

    /**
     * @notice Retrieve the current counter for a given offerer.
     *
     * @param offerer The offerer in question.
     *
     * @return counter The current counter.
     */
    function getCounter(address offerer)
        external
        view
        returns (uint256 counter);

    /**
     * @notice Retrieve configuration information for this contract.
     *
     * @return version           The contract version.
     * @return domainSeparator   The domain separator for this contract.
     * @return conduitController The conduit Controller set for this contract.
     */
    function information()
        external
        view
        returns (
            string memory version,
            bytes32 domainSeparator,
            address conduitController
        );

    /**
     * @notice Retrieve the name of this contract.
     *
     * @return contractName The name of this contract.
     */
    function name() external view returns (string memory contractName);
}

File 7 of 10 : ZoneInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

// prettier-ignore
import {
    AdvancedOrder,
    CriteriaResolver
} from "../lib/ConsiderationStructs.sol";

interface ZoneInterface {
    /**
     * @dev Emit an event whenever a zone is successfully paused.
     */
    event Paused();

    /**
     * @dev Emit an event whenever a zone is successfully unpaused (created).
     */
    event Unpaused();

    // Called by Consideration whenever extraData is not provided by the caller.
    function isValidOrder(
        bytes32 orderHash,
        address caller,
        address offerer,
        bytes32 zoneHash
    ) external view returns (bytes4 validOrderMagicValue);

    // Called by Consideration whenever any extraData is provided by the caller.
    function isValidOrderIncludingExtraData(
        bytes32 orderHash,
        address caller,
        AdvancedOrder calldata order,
        bytes32[] calldata priorOrderHashes,
        CriteriaResolver[] calldata criteriaResolvers
    ) external view returns (bytes4 validOrderMagicValue);
}

File 8 of 10 : ZoneInteractionErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

/**
 * @title ZoneInteractionErrors
 * @author 0age
 * @notice ZoneInteractionErrors contains errors related to zone interaction.
 */
interface ZoneInteractionErrors {
    /**
     * @dev Revert with an error when attempting to fill an order that specifies
     *      a restricted submitter as its order type when not submitted by
     *      either the offerer or the order's zone or approved as valid by the
     *      zone in question via a staticcall to `isValidOrder`.
     *
     * @param orderHash The order hash for the invalid restricted order.
     */
    error InvalidRestrictedOrder(bytes32 orderHash);
}

File 9 of 10 : PausableZoneInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

import { SeaportInterface } from "../../interfaces/SeaportInterface.sol";

// prettier-ignore
import {
    AdvancedOrder,
    CriteriaResolver,
    Order,
    OrderComponents,
    Fulfillment,
    Execution
} from "../../lib/ConsiderationStructs.sol";

/**
 * @title  PausableZone
 * @author cupOJoseph, BCLeFevre, ryanio
 * @notice PausableZone is a simple zone implementation that approves every
 *         order. It can be self-destructed by its controller to pause
 *         restricted orders that have it set as their zone.
 */
interface PausableZoneInterface {
    /**
     * @notice Cancel an arbitrary number of orders that have agreed to use the
     *         contract as their zone.
     *
     * @param seaport  The Seaport address.
     * @param orders   The orders to cancel.
     *
     * @return cancelled A boolean indicating whether the supplied orders have
     *                   been successfully cancelled.
     */
    function cancelOrders(
        SeaportInterface seaport,
        OrderComponents[] calldata orders
    ) external returns (bool cancelled);

    /**
     * @notice Execute an arbitrary number of matched orders, each with
     *         an arbitrary number of items for offer and consideration
     *         along with a set of fulfillments allocating offer components
     *         to consideration components.
     *
     * @param seaport      The Seaport address.
     * @param orders       The orders to match.
     * @param fulfillments An array of elements allocating offer components
     *                     to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchOrders(
        SeaportInterface seaport,
        Order[] calldata orders,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Execute an arbitrary number of matched advanced orders,
     *         each with an arbitrary number of items for offer and
     *         consideration along with a set of fulfillments allocating
     *         offer components to consideration components.
     *
     * @param seaport           The Seaport address.
     * @param orders            The orders to match.
     * @param criteriaResolvers An array where each element contains a reference
     *                          to a specific order as well as that order's
     *                          offer or consideration, a token identifier, and
     *                          a proof that the supplied token identifier is
     *                          contained in the order's merkle root.
     * @param fulfillments      An array of elements allocating offer components
     *                          to consideration components.
     *
     * @return executions An array of elements indicating the sequence of
     *                    transfers performed as part of matching the given
     *                    orders.
     */
    function executeMatchAdvancedOrders(
        SeaportInterface seaport,
        AdvancedOrder[] calldata orders,
        CriteriaResolver[] calldata criteriaResolvers,
        Fulfillment[] calldata fulfillments
    ) external payable returns (Execution[] memory executions);

    /**
     * @notice Pause this contract, safely stopping orders from using
     *         the contract as a zone. Restricted orders with this address as a
     *         zone will not be fulfillable unless the zone is redeployed to the
     *         same address.
     */
    function pause() external;

    /**
     * @notice Assign the given address with the ability to operate the zone.
     *
     * @param operatorToAssign The address to assign as the operator.
     */
    function assignOperator(address operatorToAssign) external;
}

File 10 of 10 : ConsiderationEnums.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7;

// prettier-ignore
enum OrderType {
    // 0: no partial fills, anyone can execute
    FULL_OPEN,

    // 1: partial fills supported, anyone can execute
    PARTIAL_OPEN,

    // 2: no partial fills, only offerer or zone can execute
    FULL_RESTRICTED,

    // 3: partial fills supported, only offerer or zone can execute
    PARTIAL_RESTRICTED
}

// prettier-ignore
enum BasicOrderType {
    // 0: no partial fills, anyone can execute
    ETH_TO_ERC721_FULL_OPEN,

    // 1: partial fills supported, anyone can execute
    ETH_TO_ERC721_PARTIAL_OPEN,

    // 2: no partial fills, only offerer or zone can execute
    ETH_TO_ERC721_FULL_RESTRICTED,

    // 3: partial fills supported, only offerer or zone can execute
    ETH_TO_ERC721_PARTIAL_RESTRICTED,

    // 4: no partial fills, anyone can execute
    ETH_TO_ERC1155_FULL_OPEN,

    // 5: partial fills supported, anyone can execute
    ETH_TO_ERC1155_PARTIAL_OPEN,

    // 6: no partial fills, only offerer or zone can execute
    ETH_TO_ERC1155_FULL_RESTRICTED,

    // 7: partial fills supported, only offerer or zone can execute
    ETH_TO_ERC1155_PARTIAL_RESTRICTED,

    // 8: no partial fills, anyone can execute
    ERC20_TO_ERC721_FULL_OPEN,

    // 9: partial fills supported, anyone can execute
    ERC20_TO_ERC721_PARTIAL_OPEN,

    // 10: no partial fills, only offerer or zone can execute
    ERC20_TO_ERC721_FULL_RESTRICTED,

    // 11: partial fills supported, only offerer or zone can execute
    ERC20_TO_ERC721_PARTIAL_RESTRICTED,

    // 12: no partial fills, anyone can execute
    ERC20_TO_ERC1155_FULL_OPEN,

    // 13: partial fills supported, anyone can execute
    ERC20_TO_ERC1155_PARTIAL_OPEN,

    // 14: no partial fills, only offerer or zone can execute
    ERC20_TO_ERC1155_FULL_RESTRICTED,

    // 15: partial fills supported, only offerer or zone can execute
    ERC20_TO_ERC1155_PARTIAL_RESTRICTED,

    // 16: no partial fills, anyone can execute
    ERC721_TO_ERC20_FULL_OPEN,

    // 17: partial fills supported, anyone can execute
    ERC721_TO_ERC20_PARTIAL_OPEN,

    // 18: no partial fills, only offerer or zone can execute
    ERC721_TO_ERC20_FULL_RESTRICTED,

    // 19: partial fills supported, only offerer or zone can execute
    ERC721_TO_ERC20_PARTIAL_RESTRICTED,

    // 20: no partial fills, anyone can execute
    ERC1155_TO_ERC20_FULL_OPEN,

    // 21: partial fills supported, anyone can execute
    ERC1155_TO_ERC20_PARTIAL_OPEN,

    // 22: no partial fills, only offerer or zone can execute
    ERC1155_TO_ERC20_FULL_RESTRICTED,

    // 23: partial fills supported, only offerer or zone can execute
    ERC1155_TO_ERC20_PARTIAL_RESTRICTED
}

// prettier-ignore
enum BasicOrderRouteType {
    // 0: provide Ether (or other native token) to receive offered ERC721 item.
    ETH_TO_ERC721,

    // 1: provide Ether (or other native token) to receive offered ERC1155 item.
    ETH_TO_ERC1155,

    // 2: provide ERC20 item to receive offered ERC721 item.
    ERC20_TO_ERC721,

    // 3: provide ERC20 item to receive offered ERC1155 item.
    ERC20_TO_ERC1155,

    // 4: provide ERC721 item to receive offered ERC20 item.
    ERC721_TO_ERC20,

    // 5: provide ERC1155 item to receive offered ERC20 item.
    ERC1155_TO_ERC20
}

// prettier-ignore
enum ItemType {
    // 0: ETH on mainnet, MATIC on polygon, etc.
    NATIVE,

    // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work)
    ERC20,

    // 2: ERC721 items
    ERC721,

    // 3: ERC1155 items
    ERC1155,

    // 4: ERC721 items where a number of tokenIds are supported
    ERC721_WITH_CRITERIA,

    // 5: ERC1155 items where a number of ids are supported
    ERC1155_WITH_CRITERIA
}

// prettier-ignore
enum Side {
    // 0: Items that can be spent
    OFFER,

    // 1: Items that must be received
    CONSIDERATION
}

Settings
{
  "remappings": [
    "@rari-capital/solmate/=lib/solmate/",
    "@rari-capital/solmate/=lib/solmate/",
    "contracts/=contracts/",
    "ds-test/=lib/ds-test/src/",
    "ds-test/=lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "forge-std/=lib/forge-std/src/",
    "murky/=lib/murky/src/",
    "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/",
    "contracts/=contracts/",
    "foundry/=test/foundry/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 19066
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidController","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[],"name":"InvalidPauser","type":"error"},{"inputs":[{"internalType":"address","name":"zone","type":"address"}],"name":"ZoneAlreadyExists","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"PotentialOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"zone","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"ZoneCreated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"address","name":"operatorToAssign","type":"address"}],"name":"assignOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauserToAssign","type":"address"}],"name":"assignPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"counter","type":"uint256"}],"internalType":"struct OrderComponents[]","name":"orders","type":"tuple[]"}],"name":"cancelOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createZone","outputs":[{"internalType":"address","name":"derivedAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"totalOriginalConsiderationItems","type":"uint256"}],"internalType":"struct OrderParameters","name":"parameters","type":"tuple"},{"internalType":"uint120","name":"numerator","type":"uint120"},{"internalType":"uint120","name":"denominator","type":"uint120"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AdvancedOrder[]","name":"orders","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"bytes32[]","name":"criteriaProof","type":"bytes32[]"}],"internalType":"struct CriteriaResolver[]","name":"criteriaResolvers","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"offerComponents","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"considerationComponents","type":"tuple[]"}],"internalType":"struct Fulfillment[]","name":"fulfillments","type":"tuple[]"}],"name":"executeMatchAdvancedOrders","outputs":[{"components":[{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem","name":"item","type":"tuple"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"}],"internalType":"struct Execution[]","name":"executions","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"totalOriginalConsiderationItems","type":"uint256"}],"internalType":"struct OrderParameters","name":"parameters","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Order[]","name":"orders","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"offerComponents","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"considerationComponents","type":"tuple[]"}],"internalType":"struct Fulfillment[]","name":"fulfillments","type":"tuple[]"}],"name":"executeMatchOrders","outputs":[{"components":[{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem","name":"item","type":"tuple"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"}],"internalType":"struct Execution[]","name":"executions","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"zone","type":"address"}],"name":"pause","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zoneCreationCode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60a0604052346200009b5762004a71602081380391826200002081620000a0565b9384928339810103126200009b57516001600160a01b038116908190036200009b57600080546001600160a01b0319169190911790556115b46200006760208201620000a0565b8181526020810191620034bd83395190206080526040516133e09081620000dd823960805181818161058501526107800152f35b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620000c657604052565b634e487b7160e01b600052604160045260246000fdfe60806040526004361015610013575b600080fd5b60003560e01c806323452b9c1461012b57806340ddc7881461012257806346b3ce9f146101195780637242512f1461011057806376a67a51146101075780637762df25146100fe57806379ba5097146100f55780638da5cb5b146100ec5780639fd0506d146100e3578063b44f6608146100da578063d6f3b110146100d1578063dcd5b13e146100c8578063f2fde38b146100bf5763f7e4aac6146100b757600080fd5b61000e61106b565b5061000e610f15565b5061000e610d94565b5061000e610c1d565b5061000e610ab8565b5061000e610a83565b5061000e610a4e565b5061000e6108c4565b5061000e61088f565b5061000e6107a3565b5061000e610767565b5061000e610514565b5061000e610374565b5061000e61013f565b600091031261000e57565b503461000e5760008060031936011261022a5773ffffffffffffffffffffffffffffffffffffffff81541633036101cc577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a16101c77fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b604051f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c79204f776e65722063616e2063616e63656c2e000000000000000000006044820152fd5b80fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b35906102568261022d565b565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156102c65752565b6102ce610289565b52565b60208082019080835283518092528060408094019401926000905b8382106102fb57505050505090565b90919293948360e060019284895180516103168482516102b9565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936102ec565b50608060031936011261000e5760043561038d8161022d565b6024359061039a8261022d565b67ffffffffffffffff9060443582811161000e576103bc903690600401610258565b909260643590811161000e576103d6903690600401610258565b92909373ffffffffffffffffffffffffffffffffffffffff91826000541633036104905761045e9661043a600096604051988997889687957f2718034d00000000000000000000000000000000000000000000000000000000875260048701611975565b03923491165af1908115610483575b600091610462575b50604051918291826102d1565b0390f35b61047d913d8091833e610475818361124f565b81019061167d565b38610451565b61048b611290565b610449565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f6e6c7920746865206f776e65722063616e2065786563757465206f7264657260448201527f73207769746820746865207a6f6e652e000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e5760043561056e61056761054e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b331461113b565b61064f61054e6040516020810190610633816106077f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261124f565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b803b61071f577fd1fa916c9f898e9a8dcedb0f78093657d07014799896193f2b219bed6ac7399c6106db8361045e94604051806115b48082019082821067ffffffffffffffff831117610712575b611df7833903906000f515610705575b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081019290925290918291820190565b0390a160405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b61070d611290565b6106ad565b61071a6111c6565b61069d565b6040517e83438500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e57600060031936011261000e5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461000e57602060031936011261000e576004356107c18161022d565b73ffffffffffffffffffffffffffffffffffffffff90816002541633141580610881575b6108575716803b1561000e57600080916004604051809481937f8456cb590000000000000000000000000000000000000000000000000000000083525af1801561084a575b61083b575b60405160018152602090f35b610844906111f6565b3861082f565b610852611290565b61082a565b60046040517fc7260843000000000000000000000000000000000000000000000000000000008152fd5b5081600054163314156107e5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e57600060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff6001541633036109f057604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a161094f7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06109bf61099260005473ffffffffffffffffffffffffffffffffffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909216825233602083015290918291820190565b0390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055005b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920506f74656e7469616c204f776e65722063616e20636c61696d2e006044820152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b5060a060031936011261000e5760048035610ad28161022d565b60243590610adf8261022d565b67ffffffffffffffff60443581811161000e57610aff9036908601610258565b93909260643583811161000e57610b199036908801610258565b909360843590811161000e57610b329036908901610258565b9173ffffffffffffffffffffffffffffffffffffffff9586600054163303610b99579261045e999261043a92600099989796956040519b8c9a8b998a987f65c4eb72000000000000000000000000000000000000000000000000000000008a528901611bd8565b60848a6020604051917f08c379a0000000000000000000000000000000000000000000000000000000008352820152603960248201527f4f6e6c7920746865206f776e65722063616e206578656375746520616476616e60448201527f636564206f7264657273207769746820746865207a6f6e652e000000000000006064820152fd5b503461000e57606060031936011261000e57600435610c3b8161022d565b60243590610c488261022d565b60443567ffffffffffffffff811161000e57610c68903690600401610258565b909173ffffffffffffffffffffffffffffffffffffffff9283600054163303610d10576000602094610cca96604051978896879586937fe5c27af1000000000000000000000000000000000000000000000000000000008552600485016115cd565b0393165af18015610d03575b610cdc57005b6109ee9060203d8111610cfc575b610cf4818361124f565b81019061129d565b503d610cea565b610d0b611290565b610cd6565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c7920746865206f776e65722063616e2063616e63656c206f726465727360448201527f207769746820746865207a6f6e652e00000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610db28161022d565b73ffffffffffffffffffffffffffffffffffffffff610dd681600054163314611d91565b811615610e9157610e229073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b7fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab610e8c610e6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5061757365722063616e206e6f742062652073657420746f20746865206e756c60448201527f6c206164647265737300000000000000000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610f338161022d565b73ffffffffffffffffffffffffffffffffffffffff9081600054163303610fe757610f646109ee9282161515611d2c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f6e6c79204f776e65722063616e207472616e73666572204f776e657273686960448201527f702e0000000000000000000000000000000000000000000000000000000000006064820152fd5b503461000e57604060031936011261000e576004356110898161022d565b6024356110958161022d565b73ffffffffffffffffffffffffffffffffffffffff918260009384926110bf828554163314611d91565b1692833b15611137576024908360405195869485937f84385c6f0000000000000000000000000000000000000000000000000000000085521660048401525af1801561112a575b611111575b50604051f35b8061111e611124926111f6565b80610134565b3861110b565b611132611290565b611106565b8280fd5b1561114257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f6e6c79206f776e65722063616e20637265617465206e6577205a6f6e65732060448201527f66726f6d20686572652e000000000000000000000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161120a57604052565b6112126111c6565b604052565b6060810190811067ffffffffffffffff82111761120a57604052565b60a0810190811067ffffffffffffffff82111761120a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120a57604052565b506040513d6000823e3d90fd5b9081602091031261000e5751801515810361000e5790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760a082023603831361000e57565b6006111561000e57565b9190808252602080920192916000905b828210611330575050505090565b909192938061134b600192873561134681611308565b6102b9565b73ffffffffffffffffffffffffffffffffffffffff8387013561136d8161022d565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190611322565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760c082023603831361000e57565b9190808252602080920192916000905b828210611411575050505090565b9091929380611427600192873561134681611308565b828601356114348161022d565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a0908188013561147e8161022d565b169082015260c0908101950193920190611403565b3590600482101561000e57565b9060048210156102c65752565b906114d5816114bb8461024b565b73ffffffffffffffffffffffffffffffffffffffff169052565b6115016114e46020840161024b565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b61154061152561151460408501856112b5565b610160806040870152850191611312565b61153260608501856113a0565b9084830360608601526113f3565b9161155a61155060808301611493565b60808401906114a0565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18236030181121561000e570190565b929073ffffffffffffffffffffffffffffffffffffffff60408501911684528160209160408387015252606084019360608360051b82010194846000925b85841061161c575050505050505090565b909192939495968580611661837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0866001960301885261165c8c8861159b565b6114ad565b99019401940192959493919061160b565b51906102568261022d565b6020808284031261000e57815167ffffffffffffffff9283821161000e57019083601f8301121561000e578151928311611789575b6040938451946116c7838660051b018761124f565b848652828601918360e08097028601019481861161000e578401925b8584106116f4575050505050505090565b83820387811261000e5783519161170a83611217565b60a080921261000e5788926117718893875161172581611233565b895161173081611308565b8152858a015161173f8161022d565b86820152888a0151898201526060808b0151908201526080808b0151906117658261022d565b82015283528801611672565b8382015260c0870151868201528152019301926116e3565b6117916111c6565b6116b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e57813603831361000e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18236030181121561000e570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e578160061b3603831361000e57565b9190808252602080920192916000905b8282106118c8575050505090565b833585528381013585820152604094850194909301926001909101906118ba565b90808352602080930192838260051b850194846000925b858410611911575050505050505090565b909192939495968580611964838560019503885261192f8c88611825565b9061195761194d6119408480611857565b60408086528501916118aa565b9285810190611857565b91858185039101526118aa565b990194019401929594939190611900565b90939195949273ffffffffffffffffffffffffffffffffffffffff60608301951682528060209560608785015252608082019060808160051b8401019588926000905b8382106119da5750505050506119d794955060408185039101526118e9565b90565b90919293978380611a4e83611a198f8e907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808d60019903018952611825565b90611a41611a37611a2a848061159b565b60408085528401906114ad565b9285810190611796565b91858185039101526117e6565b9a0192019201909392916119b8565b35906effffffffffffffffffffffffffffff8216820361000e57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618236030181121561000e570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161000e5760209260051b80928483013701016000815290565b90808352602080930190819360059282841b810195856000925b858410611b1857505050505050505090565b90919293949596978181038452611b2f8984611a79565b8035825286810135600281101561000e57878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57019087823592019267ffffffffffffffff831161000e57828b1b3603841361000e5760019389938493611bc69360a080928201520191611aab565b9a019401940192969594939190611b06565b9593919796949260809173ffffffffffffffffffffffffffffffffffffffff838901911688528160209184838b01525260a0998a89018b8460051b8b01019b82956000935b868510611c5157505050505050505095611c43916119d796978683036040880152611aec565b9260608185039101526118e9565b909192939480889f8198998f82037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018852611c8d9085611a79565b611c97818061159b565b878352878301611ca6916114ad565b6effffffffffffffffffffffffffffff80611cc2848701611a5d565b1684860152604090611cd5848301611a5d565b1690840152606090611ce983830184611796565b909285830390860152611cfb926117e6565b90868101611d0891611796565b909287818403910152611d1a926117e6565b9f019796956001019401929190611c1d565b15611d3357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6577204f776e65722063616e206e6f74206265203020616464726573732e006044820152fd5b15611d9857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206f6e6c792062652073657420627920746865206465706c6f796572006044820152fdfe60a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033a26469706673582212205aec1f7011fb7c666bdc59c01ee61f8e8542a4c186ee08da8530035a171780f464736f6c634300080e003360a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f

Deployed Bytecode

0x60806040526004361015610013575b600080fd5b60003560e01c806323452b9c1461012b57806340ddc7881461012257806346b3ce9f146101195780637242512f1461011057806376a67a51146101075780637762df25146100fe57806379ba5097146100f55780638da5cb5b146100ec5780639fd0506d146100e3578063b44f6608146100da578063d6f3b110146100d1578063dcd5b13e146100c8578063f2fde38b146100bf5763f7e4aac6146100b757600080fd5b61000e61106b565b5061000e610f15565b5061000e610d94565b5061000e610c1d565b5061000e610ab8565b5061000e610a83565b5061000e610a4e565b5061000e6108c4565b5061000e61088f565b5061000e6107a3565b5061000e610767565b5061000e610514565b5061000e610374565b5061000e61013f565b600091031261000e57565b503461000e5760008060031936011261022a5773ffffffffffffffffffffffffffffffffffffffff81541633036101cc577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a16101c77fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b604051f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c79204f776e65722063616e2063616e63656c2e000000000000000000006044820152fd5b80fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b35906102568261022d565b565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156102c65752565b6102ce610289565b52565b60208082019080835283518092528060408094019401926000905b8382106102fb57505050505090565b90919293948360e060019284895180516103168482516102b9565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936102ec565b50608060031936011261000e5760043561038d8161022d565b6024359061039a8261022d565b67ffffffffffffffff9060443582811161000e576103bc903690600401610258565b909260643590811161000e576103d6903690600401610258565b92909373ffffffffffffffffffffffffffffffffffffffff91826000541633036104905761045e9661043a600096604051988997889687957f2718034d00000000000000000000000000000000000000000000000000000000875260048701611975565b03923491165af1908115610483575b600091610462575b50604051918291826102d1565b0390f35b61047d913d8091833e610475818361124f565b81019061167d565b38610451565b61048b611290565b610449565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f6e6c7920746865206f776e65722063616e2065786563757465206f7264657260448201527f73207769746820746865207a6f6e652e000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e5760043561056e61056761054e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b331461113b565b61064f61054e6040516020810190610633816106077f63f1858c57c6c2e2fdb2ca34b9de90fa5f9bcb34274049b1dbb83eb66209f43e883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261124f565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b803b61071f577fd1fa916c9f898e9a8dcedb0f78093657d07014799896193f2b219bed6ac7399c6106db8361045e94604051806115b48082019082821067ffffffffffffffff831117610712575b611df7833903906000f515610705575b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081019290925290918291820190565b0390a160405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b61070d611290565b6106ad565b61071a6111c6565b61069d565b6040517e83438500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e57600060031936011261000e5760206040517f63f1858c57c6c2e2fdb2ca34b9de90fa5f9bcb34274049b1dbb83eb66209f43e8152f35b503461000e57602060031936011261000e576004356107c18161022d565b73ffffffffffffffffffffffffffffffffffffffff90816002541633141580610881575b6108575716803b1561000e57600080916004604051809481937f8456cb590000000000000000000000000000000000000000000000000000000083525af1801561084a575b61083b575b60405160018152602090f35b610844906111f6565b3861082f565b610852611290565b61082a565b60046040517fc7260843000000000000000000000000000000000000000000000000000000008152fd5b5081600054163314156107e5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e57600060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff6001541633036109f057604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a161094f7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06109bf61099260005473ffffffffffffffffffffffffffffffffffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909216825233602083015290918291820190565b0390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055005b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920506f74656e7469616c204f776e65722063616e20636c61696d2e006044820152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b5060a060031936011261000e5760048035610ad28161022d565b60243590610adf8261022d565b67ffffffffffffffff60443581811161000e57610aff9036908601610258565b93909260643583811161000e57610b199036908801610258565b909360843590811161000e57610b329036908901610258565b9173ffffffffffffffffffffffffffffffffffffffff9586600054163303610b99579261045e999261043a92600099989796956040519b8c9a8b998a987f65c4eb72000000000000000000000000000000000000000000000000000000008a528901611bd8565b60848a6020604051917f08c379a0000000000000000000000000000000000000000000000000000000008352820152603960248201527f4f6e6c7920746865206f776e65722063616e206578656375746520616476616e60448201527f636564206f7264657273207769746820746865207a6f6e652e000000000000006064820152fd5b503461000e57606060031936011261000e57600435610c3b8161022d565b60243590610c488261022d565b60443567ffffffffffffffff811161000e57610c68903690600401610258565b909173ffffffffffffffffffffffffffffffffffffffff9283600054163303610d10576000602094610cca96604051978896879586937fe5c27af1000000000000000000000000000000000000000000000000000000008552600485016115cd565b0393165af18015610d03575b610cdc57005b6109ee9060203d8111610cfc575b610cf4818361124f565b81019061129d565b503d610cea565b610d0b611290565b610cd6565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c7920746865206f776e65722063616e2063616e63656c206f726465727360448201527f207769746820746865207a6f6e652e00000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610db28161022d565b73ffffffffffffffffffffffffffffffffffffffff610dd681600054163314611d91565b811615610e9157610e229073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b7fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab610e8c610e6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5061757365722063616e206e6f742062652073657420746f20746865206e756c60448201527f6c206164647265737300000000000000000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610f338161022d565b73ffffffffffffffffffffffffffffffffffffffff9081600054163303610fe757610f646109ee9282161515611d2c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f6e6c79204f776e65722063616e207472616e73666572204f776e657273686960448201527f702e0000000000000000000000000000000000000000000000000000000000006064820152fd5b503461000e57604060031936011261000e576004356110898161022d565b6024356110958161022d565b73ffffffffffffffffffffffffffffffffffffffff918260009384926110bf828554163314611d91565b1692833b15611137576024908360405195869485937f84385c6f0000000000000000000000000000000000000000000000000000000085521660048401525af1801561112a575b611111575b50604051f35b8061111e611124926111f6565b80610134565b3861110b565b611132611290565b611106565b8280fd5b1561114257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f6e6c79206f776e65722063616e20637265617465206e6577205a6f6e65732060448201527f66726f6d20686572652e000000000000000000000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161120a57604052565b6112126111c6565b604052565b6060810190811067ffffffffffffffff82111761120a57604052565b60a0810190811067ffffffffffffffff82111761120a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120a57604052565b506040513d6000823e3d90fd5b9081602091031261000e5751801515810361000e5790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760a082023603831361000e57565b6006111561000e57565b9190808252602080920192916000905b828210611330575050505090565b909192938061134b600192873561134681611308565b6102b9565b73ffffffffffffffffffffffffffffffffffffffff8387013561136d8161022d565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190611322565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760c082023603831361000e57565b9190808252602080920192916000905b828210611411575050505090565b9091929380611427600192873561134681611308565b828601356114348161022d565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a0908188013561147e8161022d565b169082015260c0908101950193920190611403565b3590600482101561000e57565b9060048210156102c65752565b906114d5816114bb8461024b565b73ffffffffffffffffffffffffffffffffffffffff169052565b6115016114e46020840161024b565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b61154061152561151460408501856112b5565b610160806040870152850191611312565b61153260608501856113a0565b9084830360608601526113f3565b9161155a61155060808301611493565b60808401906114a0565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18236030181121561000e570190565b929073ffffffffffffffffffffffffffffffffffffffff60408501911684528160209160408387015252606084019360608360051b82010194846000925b85841061161c575050505050505090565b909192939495968580611661837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0866001960301885261165c8c8861159b565b6114ad565b99019401940192959493919061160b565b51906102568261022d565b6020808284031261000e57815167ffffffffffffffff9283821161000e57019083601f8301121561000e578151928311611789575b6040938451946116c7838660051b018761124f565b848652828601918360e08097028601019481861161000e578401925b8584106116f4575050505050505090565b83820387811261000e5783519161170a83611217565b60a080921261000e5788926117718893875161172581611233565b895161173081611308565b8152858a015161173f8161022d565b86820152888a0151898201526060808b0151908201526080808b0151906117658261022d565b82015283528801611672565b8382015260c0870151868201528152019301926116e3565b6117916111c6565b6116b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e57813603831361000e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18236030181121561000e570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e578160061b3603831361000e57565b9190808252602080920192916000905b8282106118c8575050505090565b833585528381013585820152604094850194909301926001909101906118ba565b90808352602080930192838260051b850194846000925b858410611911575050505050505090565b909192939495968580611964838560019503885261192f8c88611825565b9061195761194d6119408480611857565b60408086528501916118aa565b9285810190611857565b91858185039101526118aa565b990194019401929594939190611900565b90939195949273ffffffffffffffffffffffffffffffffffffffff60608301951682528060209560608785015252608082019060808160051b8401019588926000905b8382106119da5750505050506119d794955060408185039101526118e9565b90565b90919293978380611a4e83611a198f8e907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808d60019903018952611825565b90611a41611a37611a2a848061159b565b60408085528401906114ad565b9285810190611796565b91858185039101526117e6565b9a0192019201909392916119b8565b35906effffffffffffffffffffffffffffff8216820361000e57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618236030181121561000e570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161000e5760209260051b80928483013701016000815290565b90808352602080930190819360059282841b810195856000925b858410611b1857505050505050505090565b90919293949596978181038452611b2f8984611a79565b8035825286810135600281101561000e57878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57019087823592019267ffffffffffffffff831161000e57828b1b3603841361000e5760019389938493611bc69360a080928201520191611aab565b9a019401940192969594939190611b06565b9593919796949260809173ffffffffffffffffffffffffffffffffffffffff838901911688528160209184838b01525260a0998a89018b8460051b8b01019b82956000935b868510611c5157505050505050505095611c43916119d796978683036040880152611aec565b9260608185039101526118e9565b909192939480889f8198998f82037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018852611c8d9085611a79565b611c97818061159b565b878352878301611ca6916114ad565b6effffffffffffffffffffffffffffff80611cc2848701611a5d565b1684860152604090611cd5848301611a5d565b1690840152606090611ce983830184611796565b909285830390860152611cfb926117e6565b90868101611d0891611796565b909287818403910152611d1a926117e6565b9f019796956001019401929190611c1d565b15611d3357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6577204f776e65722063616e206e6f74206265203020616464726573732e006044820152fd5b15611d9857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206f6e6c792062652073657420627920746865206465706c6f796572006044820152fdfe60a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033a26469706673582212205aec1f7011fb7c666bdc59c01ee61f8e8542a4c186ee08da8530035a171780f464736f6c634300080e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f

-----Decoded View---------------
Arg [0] : ownerAddress (address): 0xdF7bB361dC059c185DcEd96ACe6Ec4D0C1f72b0F

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.