ETH Price: $1,919.89 (+1.35%)
 

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

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PassportLogic

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-05
*/

// File: contracts/lifecycle/PausableProxy.sol

pragma solidity ^0.4.24;

/**
 * @title PausableProxy
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract PausableProxy {
    /**
     * @dev Storage slot with the paused state of the contract.
     * This is the keccak-256 hash of "org.monetha.proxy.paused", and is
     * validated in the constructor.
     */
    bytes32 private constant PAUSED_OWNER_SLOT = 0x9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a;

    /**
     * @dev The ClaimableProxy constructor validates PENDING_OWNER_SLOT constant.
     */
    constructor() public {
        assert(PAUSED_OWNER_SLOT == keccak256("org.monetha.proxy.paused"));
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_getPaused(), "contract should not be paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_getPaused(), "contract should be paused");
        _;
    }

    /**
     * @return True when the contract is paused.
     */
    function _getPaused() internal view returns (bool paused) {
        bytes32 slot = PAUSED_OWNER_SLOT;
        assembly {
            paused := sload(slot)
        }
    }

    /**
     * @dev Sets the paused state.
     * @param _paused New paused state.
     */
    function _setPaused(bool _paused) internal {
        bytes32 slot = PAUSED_OWNER_SLOT;
        assembly {
            sstore(slot, _paused)
        }
    }
}

// File: contracts/ownership/OwnableProxy.sol

pragma solidity ^0.4.24;


/**
 * @title OwnableProxy
 */
contract OwnableProxy is PausableProxy {
    event OwnershipRenounced(address indexed previousOwner);
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Storage slot with the owner of the contract.
     * This is the keccak-256 hash of "org.monetha.proxy.owner", and is
     * validated in the constructor.
     */
    bytes32 private constant OWNER_SLOT = 0x3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d22;

    /**
     * @dev The OwnableProxy constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        assert(OWNER_SLOT == keccak256("org.monetha.proxy.owner"));

        _setOwner(msg.sender);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == _getOwner());
        _;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner whenNotPaused {
        emit OwnershipRenounced(_getOwner());
        _setOwner(address(0));
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address _newOwner) public onlyOwner whenNotPaused {
        _transferOwnership(_newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address _newOwner) internal {
        require(_newOwner != address(0));
        emit OwnershipTransferred(_getOwner(), _newOwner);
        _setOwner(_newOwner);
    }

    /**
     * @return The owner address.
     */
    function owner() public view returns (address) {
        return _getOwner();
    }

    /**
     * @return The owner address.
     */
    function _getOwner() internal view returns (address own) {
        bytes32 slot = OWNER_SLOT;
        assembly {
            own := sload(slot)
        }
    }

    /**
     * @dev Sets the address of the proxy owner.
     * @param _newOwner Address of the new proxy owner.
     */
    function _setOwner(address _newOwner) internal {
        bytes32 slot = OWNER_SLOT;

        assembly {
            sstore(slot, _newOwner)
        }
    }
}

// File: contracts/ownership/ClaimableProxy.sol

pragma solidity ^0.4.24;


/**
 * @title ClaimableProxy
 * @dev Extension for the OwnableProxy contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract ClaimableProxy is OwnableProxy {
    /**
     * @dev Storage slot with the pending owner of the contract.
     * This is the keccak-256 hash of "org.monetha.proxy.pendingOwner", and is
     * validated in the constructor.
     */
    bytes32 private constant PENDING_OWNER_SLOT = 0xcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb52;

    /**
     * @dev The ClaimableProxy constructor validates PENDING_OWNER_SLOT constant.
     */
    constructor() public {
        assert(PENDING_OWNER_SLOT == keccak256("org.monetha.proxy.pendingOwner"));
    }

    function pendingOwner() public view returns (address) {
        return _getPendingOwner();
    }

    /**
     * @dev Modifier throws if called by any account other than the pendingOwner.
     */
    modifier onlyPendingOwner() {
        require(msg.sender == _getPendingOwner());
        _;
    }

    /**
     * @dev Allows the current owner to set the pendingOwner address.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner whenNotPaused {
        _setPendingOwner(newOwner);
    }

    /**
     * @dev Allows the pendingOwner address to finalize the transfer.
     */
    function claimOwnership() public onlyPendingOwner whenNotPaused {
        emit OwnershipTransferred(_getOwner(), _getPendingOwner());
        _setOwner(_getPendingOwner());
        _setPendingOwner(address(0));
    }

    /**
     * @return The pending owner address.
     */
    function _getPendingOwner() internal view returns (address penOwn) {
        bytes32 slot = PENDING_OWNER_SLOT;
        assembly {
            penOwn := sload(slot)
        }
    }

    /**
     * @dev Sets the address of the pending owner.
     * @param _newPendingOwner Address of the new pending owner.
     */
    function _setPendingOwner(address _newPendingOwner) internal {
        bytes32 slot = PENDING_OWNER_SLOT;

        assembly {
            sstore(slot, _newPendingOwner)
        }
    }
}

// File: contracts/IPassportLogic.sol

pragma solidity ^0.4.24;

interface IPassportLogic {
    /**
     * @dev Returns the owner address of contract.
     */
    function owner() external view returns (address);

    /**** Storage Set Methods ***********/

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setAddress(bytes32 _key, address _value) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setUint(bytes32 _key, uint _value) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setInt(bytes32 _key, int _value) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setBool(bytes32 _key, bool _value) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setString(bytes32 _key, string _value) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setBytes(bytes32 _key, bytes _value) external;

    /// @param _key The key for the record
    function setTxDataBlockNumber(bytes32 _key, bytes _data) external;

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setIPFSHash(bytes32 _key, string _value) external;

    /**** Storage Delete Methods ***********/

    /// @param _key The key for the record
    function deleteAddress(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteUint(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteInt(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteBool(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteString(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteBytes(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteTxDataBlockNumber(bytes32 _key) external;

    /// @param _key The key for the record
    function deleteIPFSHash(bytes32 _key) external;

    /**** Storage Get Methods ***********/

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getAddress(address _factProvider, bytes32 _key) external view returns (bool success, address value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getUint(address _factProvider, bytes32 _key) external view returns (bool success, uint value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getInt(address _factProvider, bytes32 _key) external view returns (bool success, int value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getBool(address _factProvider, bytes32 _key) external view returns (bool success, bool value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getString(address _factProvider, bytes32 _key) external view returns (bool success, string value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getBytes(address _factProvider, bytes32 _key) external view returns (bool success, bytes value);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getTxDataBlockNumber(address _factProvider, bytes32 _key) external view returns (bool success, uint blockNumber);

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getIPFSHash(address _factProvider, bytes32 _key) external view returns (bool success, string value);
}

// File: contracts/storage/Storage.sol

pragma solidity ^0.4.24;


// Storage contracts holds all state.
// Do not change the order of the fields, аdd new fields to the end of the contract!
contract Storage is ClaimableProxy
{
    /***************************************************************************
     *** STORAGE VARIABLES. DO NOT REORDER!!! ADD NEW VARIABLE TO THE END!!! ***
     ***************************************************************************/

    struct AddressValue {
        bool initialized;
        address value;
    }

    mapping(address => mapping(bytes32 => AddressValue)) internal addressStorage;

    struct UintValue {
        bool initialized;
        uint value;
    }

    mapping(address => mapping(bytes32 => UintValue)) internal uintStorage;

    struct IntValue {
        bool initialized;
        int value;
    }

    mapping(address => mapping(bytes32 => IntValue)) internal intStorage;

    struct BoolValue {
        bool initialized;
        bool value;
    }

    mapping(address => mapping(bytes32 => BoolValue)) internal boolStorage;

    struct StringValue {
        bool initialized;
        string value;
    }

    mapping(address => mapping(bytes32 => StringValue)) internal stringStorage;

    struct BytesValue {
        bool initialized;
        bytes value;
    }

    mapping(address => mapping(bytes32 => BytesValue)) internal bytesStorage;

    struct BlockNumberValue {
        bool initialized;
        uint blockNumber;
    }

    mapping(address => mapping(bytes32 => BlockNumberValue)) internal txBytesStorage;

    bool private onlyFactProviderFromWhitelistAllowed;
    mapping(address => bool) private factProviderWhitelist;

    struct IPFSHashValue {
        bool initialized;
        string value;
    }

    mapping(address => mapping(bytes32 => IPFSHashValue)) internal ipfsHashStorage;

    struct PrivateData {
        string dataIPFSHash; // The IPFS hash of encrypted private data
        bytes32 dataKeyHash; // The hash of symmetric key that was used to encrypt the data
    }

    struct PrivateDataValue {
        bool initialized;
        PrivateData value;
    }

    mapping(address => mapping(bytes32 => PrivateDataValue)) internal privateDataStorage;

    enum PrivateDataExchangeState {Closed, Proposed, Accepted}

    struct PrivateDataExchange {
        address dataRequester;          // The address of the data requester
        uint256 dataRequesterValue;     // The amount staked by the data requester
        address passportOwner;          // The address of the passport owner at the time of the data exchange proposition
        uint256 passportOwnerValue;     // Tha amount staked by the passport owner
        address factProvider;           // The private data provider
        bytes32 key;                    // the key for the private data record
        string dataIPFSHash;            // The IPFS hash of encrypted private data
        bytes32 dataKeyHash;            // The hash of data symmetric key that was used to encrypt the data
        bytes encryptedExchangeKey;     // The encrypted exchange session key (only passport owner can decrypt it)
        bytes32 exchangeKeyHash;        // The hash of exchange session key
        bytes32 encryptedDataKey;       // The data symmetric key XORed with the exchange key
        PrivateDataExchangeState state; // The state of private data exchange
        uint256 stateExpired;           // The state expiration timestamp
    }

    uint public openPrivateDataExchangesCount; // the count of open private data exchanges TODO: use it in contract destruction/ownership transfer logic
    PrivateDataExchange[] public privateDataExchanges;

    /***************************************************************************
     *** END OF SECTION OF STORAGE VARIABLES                                 ***
     ***************************************************************************/

    event WhitelistOnlyPermissionSet(bool indexed onlyWhitelist);
    event WhitelistFactProviderAdded(address indexed factProvider);
    event WhitelistFactProviderRemoved(address indexed factProvider);

    /**
     *  Restrict methods in such way, that they can be invoked only by allowed fact provider.
     */
    modifier allowedFactProvider() {
        require(isAllowedFactProvider(msg.sender));
        _;
    }

    /**
     *  Returns true when the given address is an allowed fact provider.
     */
    function isAllowedFactProvider(address _address) public view returns (bool) {
        return !onlyFactProviderFromWhitelistAllowed || factProviderWhitelist[_address] || _address == _getOwner();
    }

    /**
     *  Returns true when a whitelist of fact providers is enabled.
     */
    function isWhitelistOnlyPermissionSet() external view returns (bool) {
        return onlyFactProviderFromWhitelistAllowed;
    }

    /**
     *  Enables or disables the use of a whitelist of fact providers.
     */
    function setWhitelistOnlyPermission(bool _onlyWhitelist) onlyOwner external {
        onlyFactProviderFromWhitelistAllowed = _onlyWhitelist;
        emit WhitelistOnlyPermissionSet(_onlyWhitelist);
    }

    /**
     *  Returns true if fact provider is added to the whitelist.
     */
    function isFactProviderInWhitelist(address _address) external view returns (bool) {
        return factProviderWhitelist[_address];
    }

    /**
     *  Allows owner to add fact provider to whitelist.
     */
    function addFactProviderToWhitelist(address _address) onlyOwner external {
        factProviderWhitelist[_address] = true;
        emit WhitelistFactProviderAdded(_address);
    }

    /**
     *  Allows owner to remove fact provider from whitelist.
     */
    function removeFactProviderFromWhitelist(address _address) onlyOwner external {
        delete factProviderWhitelist[_address];
        emit WhitelistFactProviderRemoved(_address);
    }
}

// File: contracts/storage/AddressStorageLogic.sol

pragma solidity ^0.4.24;


contract AddressStorageLogic is Storage {
    event AddressUpdated(address indexed factProvider, bytes32 indexed key);
    event AddressDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setAddress(bytes32 _key, address _value) external {
        _setAddress(_key, _value);
    }

    /// @param _key The key for the record
    function deleteAddress(bytes32 _key) external {
        _deleteAddress(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getAddress(address _factProvider, bytes32 _key) external view returns (bool success, address value) {
        return _getAddress(_factProvider, _key);
    }

    function _setAddress(bytes32 _key, address _value) allowedFactProvider internal {
        addressStorage[msg.sender][_key] = AddressValue({
            initialized : true,
            value : _value
            });
        emit AddressUpdated(msg.sender, _key);
    }

    function _deleteAddress(bytes32 _key) allowedFactProvider internal {
        delete addressStorage[msg.sender][_key];
        emit AddressDeleted(msg.sender, _key);
    }

    function _getAddress(address _factProvider, bytes32 _key) internal view returns (bool success, address value) {
        AddressValue storage initValue = addressStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/UintStorageLogic.sol

pragma solidity ^0.4.24;


contract UintStorageLogic is Storage {
    event UintUpdated(address indexed factProvider, bytes32 indexed key);
    event UintDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setUint(bytes32 _key, uint _value) external {
        _setUint(_key, _value);
    }

    /// @param _key The key for the record
    function deleteUint(bytes32 _key) external {
        _deleteUint(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getUint(address _factProvider, bytes32 _key) external view returns (bool success, uint value) {
        return _getUint(_factProvider, _key);
    }

    function _setUint(bytes32 _key, uint _value) allowedFactProvider internal {
        uintStorage[msg.sender][_key] = UintValue({
            initialized : true,
            value : _value
            });
        emit UintUpdated(msg.sender, _key);
    }

    function _deleteUint(bytes32 _key) allowedFactProvider internal {
        delete uintStorage[msg.sender][_key];
        emit UintDeleted(msg.sender, _key);
    }

    function _getUint(address _factProvider, bytes32 _key) internal view returns (bool success, uint value) {
        UintValue storage initValue = uintStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/IntStorageLogic.sol

pragma solidity ^0.4.24;


contract IntStorageLogic is Storage {
    event IntUpdated(address indexed factProvider, bytes32 indexed key);
    event IntDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setInt(bytes32 _key, int _value) external {
        _setInt(_key, _value);
    }

    /// @param _key The key for the record
    function deleteInt(bytes32 _key) external {
        _deleteInt(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getInt(address _factProvider, bytes32 _key) external view returns (bool success, int value) {
        return _getInt(_factProvider, _key);
    }

    function _setInt(bytes32 _key, int _value) allowedFactProvider internal {
        intStorage[msg.sender][_key] = IntValue({
            initialized : true,
            value : _value
            });
        emit IntUpdated(msg.sender, _key);
    }

    function _deleteInt(bytes32 _key) allowedFactProvider internal {
        delete intStorage[msg.sender][_key];
        emit IntDeleted(msg.sender, _key);
    }

    function _getInt(address _factProvider, bytes32 _key) internal view returns (bool success, int value) {
        IntValue storage initValue = intStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/BoolStorageLogic.sol

pragma solidity ^0.4.24;


contract BoolStorageLogic is Storage {
    event BoolUpdated(address indexed factProvider, bytes32 indexed key);
    event BoolDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setBool(bytes32 _key, bool _value) external {
        _setBool(_key, _value);
    }

    /// @param _key The key for the record
    function deleteBool(bytes32 _key) external {
        _deleteBool(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getBool(address _factProvider, bytes32 _key) external view returns (bool success, bool value) {
        return _getBool(_factProvider, _key);
    }

    function _setBool(bytes32 _key, bool _value) allowedFactProvider internal {
        boolStorage[msg.sender][_key] = BoolValue({
            initialized : true,
            value : _value
            });
        emit BoolUpdated(msg.sender, _key);
    }

    function _deleteBool(bytes32 _key) allowedFactProvider internal {
        delete boolStorage[msg.sender][_key];
        emit BoolDeleted(msg.sender, _key);
    }

    function _getBool(address _factProvider, bytes32 _key) internal view returns (bool success, bool value) {
        BoolValue storage initValue = boolStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/StringStorageLogic.sol

pragma solidity ^0.4.24;


contract StringStorageLogic is Storage {
    event StringUpdated(address indexed factProvider, bytes32 indexed key);
    event StringDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setString(bytes32 _key, string _value) external {
        _setString(_key, _value);
    }

    /// @param _key The key for the record
    function deleteString(bytes32 _key) external {
        _deleteString(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getString(address _factProvider, bytes32 _key) external view returns (bool success, string value) {
        return _getString(_factProvider, _key);
    }

    function _setString(bytes32 _key, string _value) allowedFactProvider internal {
        stringStorage[msg.sender][_key] = StringValue({
            initialized : true,
            value : _value
            });
        emit StringUpdated(msg.sender, _key);
    }

    function _deleteString(bytes32 _key) allowedFactProvider internal {
        delete stringStorage[msg.sender][_key];
        emit StringDeleted(msg.sender, _key);
    }

    function _getString(address _factProvider, bytes32 _key) internal view returns (bool success, string value) {
        StringValue storage initValue = stringStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/BytesStorageLogic.sol

pragma solidity ^0.4.24;


contract BytesStorageLogic is Storage {
    event BytesUpdated(address indexed factProvider, bytes32 indexed key);
    event BytesDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setBytes(bytes32 _key, bytes _value) external {
        _setBytes(_key, _value);
    }

    /// @param _key The key for the record
    function deleteBytes(bytes32 _key) external {
        _deleteBytes(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getBytes(address _factProvider, bytes32 _key) external view returns (bool success, bytes value) {
        return _getBytes(_factProvider, _key);
    }

    function _setBytes(bytes32 _key, bytes _value) allowedFactProvider internal {
        bytesStorage[msg.sender][_key] = BytesValue({
            initialized : true,
            value : _value
            });
        emit BytesUpdated(msg.sender, _key);
    }

    function _deleteBytes(bytes32 _key) allowedFactProvider internal {
        delete bytesStorage[msg.sender][_key];
        emit BytesDeleted(msg.sender, _key);
    }

    function _getBytes(address _factProvider, bytes32 _key) internal view returns (bool success, bytes value) {
        BytesValue storage initValue = bytesStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: contracts/storage/TxDataStorageLogic.sol

pragma solidity ^0.4.24;


/**
 * @title TxDataStorage
 * @dev This contract saves only the block number for the input data. The input data is not stored into
 * Ethereum storage, but it can be decoded from the transaction input data later.
 */
contract TxDataStorageLogic is Storage {
    event TxDataUpdated(address indexed factProvider, bytes32 indexed key);
    event TxDataDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _data The data for the record. Ignore "unused function parameter" warning, it's not commented out so that
    ///              it would remain in the ABI file.
    function setTxDataBlockNumber(bytes32 _key, bytes _data) allowedFactProvider external {
        _data;
        txBytesStorage[msg.sender][_key] = BlockNumberValue({
            initialized : true,
            blockNumber : block.number
            });
        emit TxDataUpdated(msg.sender, _key);
    }

    /// @param _key The key for the record
    function deleteTxDataBlockNumber(bytes32 _key) allowedFactProvider external {
        delete txBytesStorage[msg.sender][_key];
        emit TxDataDeleted(msg.sender, _key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getTxDataBlockNumber(address _factProvider, bytes32 _key) external view returns (bool success, uint blockNumber) {
        return _getTxDataBlockNumber(_factProvider, _key);
    }

    function _getTxDataBlockNumber(address _factProvider, bytes32 _key) private view returns (bool success, uint blockNumber) {
        BlockNumberValue storage initValue = txBytesStorage[_factProvider][_key];
        return (initValue.initialized, initValue.blockNumber);
    }
}

// File: contracts/storage/IPFSStorageLogic.sol

pragma solidity ^0.4.24;


contract IPFSStorageLogic is Storage {
    event IPFSHashUpdated(address indexed factProvider, bytes32 indexed key);
    event IPFSHashDeleted(address indexed factProvider, bytes32 indexed key);

    /// @param _key The key for the record
    /// @param _value The value for the record
    function setIPFSHash(bytes32 _key, string _value) external {
        _setIPFSHash(_key, _value);
    }

    /// @param _key The key for the record
    function deleteIPFSHash(bytes32 _key) external {
        _deleteIPFSHash(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getIPFSHash(address _factProvider, bytes32 _key) external view returns (bool success, string value) {
        return _getIPFSHash(_factProvider, _key);
    }

    function _setIPFSHash(bytes32 _key, string _value) allowedFactProvider internal {
        ipfsHashStorage[msg.sender][_key] = IPFSHashValue({
            initialized : true,
            value : _value
            });
        emit IPFSHashUpdated(msg.sender, _key);
    }

    function _deleteIPFSHash(bytes32 _key) allowedFactProvider internal {
        delete ipfsHashStorage[msg.sender][_key];
        emit IPFSHashDeleted(msg.sender, _key);
    }

    function _getIPFSHash(address _factProvider, bytes32 _key) internal view returns (bool success, string value) {
        IPFSHashValue storage initValue = ipfsHashStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value);
    }
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: contracts/storage/PrivateDataStorageLogic.sol

pragma solidity ^0.4.24;



contract PrivateDataStorageLogic is Storage {
    using SafeMath for uint256;

    event PrivateDataHashesUpdated(address indexed factProvider, bytes32 indexed key);
    event PrivateDataHashesDeleted(address indexed factProvider, bytes32 indexed key);

    event PrivateDataExchangeProposed(uint256 indexed exchangeIdx, address indexed dataRequester, address indexed passportOwner);
    event PrivateDataExchangeAccepted(uint256 indexed exchangeIdx, address indexed dataRequester, address indexed passportOwner);
    event PrivateDataExchangeClosed(uint256 indexed exchangeIdx);
    event PrivateDataExchangeDisputed(uint256 indexed exchangeIdx, bool indexed successful, address indexed cheater);

    uint256 constant public privateDataExchangeProposeTimeout = 1 days;
    uint256 constant public privateDataExchangeAcceptTimeout = 1 days;

    /// @param _key The key for the record
    /// @param _dataIPFSHash The IPFS hash of encrypted private data
    /// @param _dataKeyHash The hash of symmetric key that was used to encrypt the data
    function setPrivateDataHashes(bytes32 _key, string _dataIPFSHash, bytes32 _dataKeyHash) external {
        _setPrivateDataHashes(_key, _dataIPFSHash, _dataKeyHash);
    }

    /// @param _key The key for the record
    function deletePrivateDataHashes(bytes32 _key) external {
        _deletePrivateDataHashes(_key);
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    function getPrivateDataHashes(address _factProvider, bytes32 _key) external view returns (bool success, string dataIPFSHash, bytes32 dataKeyHash) {
        return _getPrivateDataHashes(_factProvider, _key);
    }

    /**
     * @dev returns the number of private data exchanges created.
     */
    function getPrivateDataExchangesCount() public constant returns (uint256 count) {
        return privateDataExchanges.length;
    }

    /// @param _factProvider The fact provider
    /// @param _key The key for the record
    /// @param _encryptedExchangeKey The encrypted exchange session key (only passport owner can decrypt it)
    /// @param _exchangeKeyHash The hash of exchange session key
    function proposePrivateDataExchange(
        address _factProvider,
        bytes32 _key,
        bytes _encryptedExchangeKey,
        bytes32 _exchangeKeyHash
    ) external payable {
        (bool success, string memory dataIPFSHash, bytes32 dataKeyHash) = _getPrivateDataHashes(_factProvider, _key);
        require(success, "private data must exist");

        address passportOwner = _getOwner();
        bytes32 encryptedDataKey;
        PrivateDataExchange memory exchange = PrivateDataExchange({
            dataRequester : msg.sender,
            dataRequesterValue : msg.value,
            passportOwner : passportOwner,
            passportOwnerValue : 0,
            factProvider : _factProvider,
            key : _key,
            dataIPFSHash : dataIPFSHash,
            dataKeyHash : dataKeyHash,
            encryptedExchangeKey : _encryptedExchangeKey,
            exchangeKeyHash : _exchangeKeyHash,
            encryptedDataKey : encryptedDataKey,
            state : PrivateDataExchangeState.Proposed,
            stateExpired : _nowSeconds() + privateDataExchangeProposeTimeout
            });
        privateDataExchanges.push(exchange);

        _incOpenPrivateDataExchangesCount();

        uint256 exchangeIdx = privateDataExchanges.length - 1;
        emit PrivateDataExchangeProposed(exchangeIdx, msg.sender, passportOwner);
    }

    /// @param _exchangeIdx The private data exchange index
    /// @param _encryptedDataKey The data symmetric key XORed with the exchange key
    function acceptPrivateDataExchange(uint256 _exchangeIdx, bytes32 _encryptedDataKey) external payable {
        require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index");
        PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
        require(msg.sender == exchange.passportOwner, "only passport owner allowed");
        require(PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state");
        require(msg.value >= exchange.dataRequesterValue, "need to stake at least data requester amount");
        require(_nowSeconds() < exchange.stateExpired, "exchange state expired");

        exchange.passportOwnerValue = msg.value;
        exchange.encryptedDataKey = _encryptedDataKey;
        exchange.state = PrivateDataExchangeState.Accepted;
        exchange.stateExpired = _nowSeconds() + privateDataExchangeAcceptTimeout;

        emit PrivateDataExchangeAccepted(_exchangeIdx, exchange.dataRequester, msg.sender);
    }

    /// @param _exchangeIdx The private data exchange index
    function finishPrivateDataExchange(uint256 _exchangeIdx) external {
        require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index");
        PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
        require(PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state");
        require(_nowSeconds() > exchange.stateExpired || msg.sender == exchange.dataRequester, "exchange must be either expired or be finished by the data requester");

        exchange.state = PrivateDataExchangeState.Closed;

        // transfer all exchange staked money to passport owner
        uint256 val = exchange.dataRequesterValue.add(exchange.passportOwnerValue);
        require(exchange.passportOwner.send(val));

        _decOpenPrivateDataExchangesCount();

        emit PrivateDataExchangeClosed(_exchangeIdx);
    }

    /// @param _exchangeIdx The private data exchange index
    function timeoutPrivateDataExchange(uint256 _exchangeIdx) external {
        require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index");
        PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
        require(PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state");
        require(msg.sender == exchange.dataRequester, "only data requester allowed");
        require(_nowSeconds() > exchange.stateExpired, "exchange must be expired");

        exchange.state = PrivateDataExchangeState.Closed;

        // return staked amount to data requester
        require(exchange.dataRequester.send(exchange.dataRequesterValue));

        _decOpenPrivateDataExchangesCount();

        emit PrivateDataExchangeClosed(_exchangeIdx);
    }

    /// @param _exchangeIdx The private data exchange index
    /// @param _exchangeKey The unencrypted exchange session key
    function disputePrivateDataExchange(uint256 _exchangeIdx, bytes32 _exchangeKey) external {
        require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index");
        PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx];
        require(PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state");
        require(msg.sender == exchange.dataRequester, "only data requester allowed");
        require(_nowSeconds() < exchange.stateExpired, "exchange must not be expired");
        require(keccak256(abi.encodePacked(_exchangeKey)) == exchange.exchangeKeyHash, "exchange key hash must match");

        bytes32 dataKey = _exchangeKey ^ exchange.encryptedDataKey;
        // data symmetric key is XORed with exchange key
        bool validDataKey = keccak256(abi.encodePacked(dataKey)) == exchange.dataKeyHash;

        exchange.state = PrivateDataExchangeState.Closed;

        uint256 val = exchange.dataRequesterValue.add(exchange.passportOwnerValue);

        address cheater;
        if (validDataKey) {// the data key was valid -> data requester cheated
            require(exchange.passportOwner.send(val));
            cheater = exchange.dataRequester;
        } else {// the data key is invalid -> passport owner cheated
            require(exchange.dataRequester.send(val));
            cheater = exchange.passportOwner;
        }

        _decOpenPrivateDataExchangesCount();

        emit PrivateDataExchangeClosed(_exchangeIdx);
        emit PrivateDataExchangeDisputed(_exchangeIdx, !validDataKey, cheater);
    }

    function _incOpenPrivateDataExchangesCount() internal {
        if (++openPrivateDataExchangesCount == 1) {
            // don't allow passport owner to transfer ownership and destroy passport when there are open exchanges
            _setPaused(true);
        }
    }

    function _decOpenPrivateDataExchangesCount() internal {
        if (--openPrivateDataExchangesCount == 0) {
            // allow passport owner to transfer ownership and destroy passport when all exchanges are closed
            _setPaused(false);
        }
    }

    function _setPrivateDataHashes(bytes32 _key, string _dataIPFSHash, bytes32 _dataKeyHash) allowedFactProvider internal {
        privateDataStorage[msg.sender][_key] = PrivateDataValue({
            initialized : true,
            value : PrivateData({
                dataIPFSHash : _dataIPFSHash,
                dataKeyHash : _dataKeyHash
                })
            });
        emit PrivateDataHashesUpdated(msg.sender, _key);
    }

    function _deletePrivateDataHashes(bytes32 _key) allowedFactProvider internal {
        delete privateDataStorage[msg.sender][_key];
        emit PrivateDataHashesDeleted(msg.sender, _key);
    }

    function _getPrivateDataHashes(address _factProvider, bytes32 _key) internal view returns (bool success, string dataIPFSHash, bytes32 dataKeyHash) {
        PrivateDataValue storage initValue = privateDataStorage[_factProvider][_key];
        return (initValue.initialized, initValue.value.dataIPFSHash, initValue.value.dataKeyHash);
    }

    function _nowSeconds() private view returns(uint256) {
        uint256 t = now;

        // In Quorum blockchain timestamp is in nanoseconds, not seconds:
        // https://github.com/jpmorganchase/quorum/issues/713
        // https://github.com/jpmorganchase/quorum/issues/190
        if (t > 150000000000000000) {
            t /= 1000000000;
        }

        return t;
    }
}

// File: contracts/PassportLogic.sol

pragma solidity ^0.4.24;












contract PassportLogic
is IPassportLogic
, ClaimableProxy
, AddressStorageLogic
, UintStorageLogic
, IntStorageLogic
, BoolStorageLogic
, StringStorageLogic
, BytesStorageLogic
, TxDataStorageLogic
, IPFSStorageLogic
, PrivateDataStorageLogic
{}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"}],"name":"finishPrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"}],"name":"timeoutPrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"privateDataExchangeAcceptTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getTxDataBlockNumber","outputs":[{"name":"success","type":"bool"},{"name":"blockNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isAllowedFactProvider","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getIPFSHash","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteIPFSHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_onlyWhitelist","type":"bool"}],"name":"setWhitelistOnlyPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteBool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getPrivateDataHashes","outputs":[{"name":"success","type":"bool"},{"name":"dataIPFSHash","type":"string"},{"name":"dataKeyHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes"}],"name":"setBytes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_data","type":"bytes"}],"name":"setTxDataBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteBytes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isWhitelistOnlyPermissionSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deletePrivateDataHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getBytes","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"string"}],"name":"setIPFSHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeFactProviderFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"privateDataExchanges","outputs":[{"name":"dataRequester","type":"address"},{"name":"dataRequesterValue","type":"uint256"},{"name":"passportOwner","type":"address"},{"name":"passportOwnerValue","type":"uint256"},{"name":"factProvider","type":"address"},{"name":"key","type":"bytes32"},{"name":"dataIPFSHash","type":"string"},{"name":"dataKeyHash","type":"bytes32"},{"name":"encryptedExchangeKey","type":"bytes"},{"name":"exchangeKeyHash","type":"bytes32"},{"name":"encryptedDataKey","type":"bytes32"},{"name":"state","type":"uint8"},{"name":"stateExpired","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getUint","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getAddress","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrivateDataExchangesCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"},{"name":"_encryptedDataKey","type":"bytes32"}],"name":"acceptPrivateDataExchange","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isFactProviderInWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getInt","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getBool","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteTxDataBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"privateDataExchangeProposeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"bool"}],"name":"setBool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addFactProviderToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"address"}],"name":"setAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"openPrivateDataExchangesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"},{"name":"_encryptedExchangeKey","type":"bytes"},{"name":"_exchangeKeyHash","type":"bytes32"}],"name":"proposePrivateDataExchange","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getString","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_dataIPFSHash","type":"string"},{"name":"_dataKeyHash","type":"bytes32"}],"name":"setPrivateDataHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"},{"name":"_exchangeKey","type":"bytes32"}],"name":"disputePrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"PrivateDataHashesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"PrivateDataHashesDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"dataRequester","type":"address"},{"indexed":true,"name":"passportOwner","type":"address"}],"name":"PrivateDataExchangeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"dataRequester","type":"address"},{"indexed":true,"name":"passportOwner","type":"address"}],"name":"PrivateDataExchangeAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"}],"name":"PrivateDataExchangeClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"successful","type":"bool"},{"indexed":true,"name":"cheater","type":"address"}],"name":"PrivateDataExchangeDisputed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IPFSHashUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IPFSHashDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"TxDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"TxDataDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BytesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BytesDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"StringUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"StringDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BoolDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IntUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IntDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"UintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"UintDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"AddressDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"onlyWhitelist","type":"bool"}],"name":"WhitelistOnlyPermissionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"}],"name":"WhitelistFactProviderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"}],"name":"WhitelistFactProviderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060408190527f6f72672e6d6f6e657468612e70726f78792e6f776e6572000000000000000000905261003b3364010000000061009a810204565b604080517f6f72672e6d6f6e657468612e70726f78792e70656e64696e674f776e657200008152905190819003601e0190207fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb521461009557fe5b6100be565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b6130e480620000ce6000396000f3006080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306427a88811461024a57806308c50498146102645780630a2565251461027c5780630e14a376146102a3578063174a6277146102bb57806320888158146102fa57806322b96b631461032f578063257781e7146103d65780632b42a89a146103ee5780632c62ff2d146104085780632db27bd2146104205780632e28d084146104cb5780633e49bed0146104ef5780634e71e0c81461050a5780635b2a372d1461051f578063616b59f61461054357806361a2d0761461055b57806363019d1d146105705780636556f767146105885780636bfc8bb5146105ac5780636d4e7802146105d05780636e899550146105f15780636f618f9a14610615578063715018a6146107bc57806371658552146107d15780637ac4ed64146107f55780637dd291e41461083c57806386ca9a7c146108515780638ae44a081461085f5780638c160095146108805780638da5cb5b1461089857806395ee8bae146108c95780639d74b37d146108ed578063a2b6cbe11461092c578063ab338e361461027c578063abfdcced14610944578063ac0aeb1a14610961578063ca446dd914610982578063caa95f1b146109a6578063cea332cc146109bb578063e2a4853a146109e2578063e2b202bf146109fd578063e30c397814610a15578063e318de7314610a2a578063e75a836a14610a4e578063f2fde38b14610a75578063f6bb3cc414610a96578063fc2d058414610aae575b600080fd5b34801561025657600080fd5b50610262600435610ac9565b005b34801561027057600080fd5b50610262600435610d01565b34801561028857600080fd5b50610291610f21565b60408051918252519081900360200190f35b3480156102af57600080fd5b50610262600435610f28565b3480156102c757600080fd5b506102df600160a060020a0360043516602435610f34565b60408051921515835260208301919091528051918290030190f35b34801561030657600080fd5b5061031b600160a060020a0360043516610f4c565b604080519115158252519081900360200190f35b34801561033b57600080fd5b50610353600160a060020a0360043516602435610fa2565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039a578181015183820152602001610382565b50505050905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156103e257600080fd5b50610262600435610fb0565b3480156103fa57600080fd5b506102626004351515610fb9565b34801561041457600080fd5b50610262600435611012565b34801561042c57600080fd5b50610444600160a060020a036004351660243561101b565b604080518415158152908101829052606060208083018281528551928401929092528451608084019186019080838360005b8381101561048e578181015183820152602001610476565b50505050905090810190601f1680156104bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156104d757600080fd5b50610262600480359060248035908101910135611038565b3480156104fb57600080fd5b50610262600435602435611077565b34801561051657600080fd5b50610262611085565b34801561052b57600080fd5b50610262600480359060248035908101910135611168565b34801561054f57600080fd5b506102626004356111ed565b34801561056757600080fd5b5061031b6111f6565b34801561057c57600080fd5b50610262600435611200565b34801561059457600080fd5b50610353600160a060020a0360043516602435611209565b3480156105b857600080fd5b50610262600480359060248035908101910135611217565b3480156105dc57600080fd5b50610262600160a060020a0360043516611251565b3480156105fd57600080fd5b506102626004803590602480359081019101356112b6565b34801561062157600080fd5b5061062d6004356112f0565b604051808e600160a060020a0316600160a060020a031681526020018d81526020018c600160a060020a0316600160a060020a031681526020018b81526020018a600160a060020a0316600160a060020a03168152602001896000191660001916815260200180602001886000191660001916815260200180602001876000191660001916815260200186600019166000191681526020018560028111156106d157fe5b60ff16815260200184815260200183810383528a818151815260200191508051906020019080838360005b838110156107145781810151838201526020016106fc565b50505050905090810190601f1680156107415780820380516001836020036101000a031916815260200191505b5083810382528851815288516020918201918a019080838360005b8381101561077457818101518382015260200161075c565b50505050905090810190601f1680156107a15780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b3480156107c857600080fd5b50610262611490565b3480156107dd57600080fd5b506102df600160a060020a0360043516602435611550565b34801561080157600080fd5b50610819600160a060020a036004351660243561155d565b604080519215158352600160a060020a0390911660208301528051918290030190f35b34801561084857600080fd5b5061029161156a565b610262600435602435611570565b34801561086b57600080fd5b5061031b600160a060020a0360043516611807565b34801561088c57600080fd5b50610262600435611825565b3480156108a457600080fd5b506108ad61182e565b60408051600160a060020a039092168252519081900360200190f35b3480156108d557600080fd5b506102df600160a060020a036004351660243561183d565b3480156108f957600080fd5b50610911600160a060020a036004351660243561184a565b60408051921515835290151560208301528051918290030190f35b34801561093857600080fd5b50610262600435611857565b34801561095057600080fd5b5061026260043560243515156118be565b34801561096d57600080fd5b50610262600160a060020a03600435166118c8565b34801561098e57600080fd5b50610262600435600160a060020a0360243516611930565b3480156109b257600080fd5b5061029161193a565b61026260048035600160a060020a0316906024803591604435918201910135606435611940565b3480156109ee57600080fd5b50610262600435602435611cd2565b348015610a0957600080fd5b50610262600435611cdc565b348015610a2157600080fd5b506108ad611ce5565b348015610a3657600080fd5b50610353600160a060020a0360043516602435611cef565b348015610a5a57600080fd5b50610262600480359060248035908101910135604435611cfd565b348015610a8157600080fd5b50610262600160a060020a0360043516611d3f565b348015610aa257600080fd5b50610262600435611dc1565b348015610aba57600080fd5b50610262600435602435611dca565b600c5460009081908310610b15576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805484908110610b2357fe5b60009182526020909120600d90910201600b81015490925060ff166002811115610b4957fe5b600214610bae576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b81600c0154610bbb612205565b1180610bd057508154600160a060020a031633145b1515610c73576040805160e560020a62461bcd028152602060048201526044602482018190527f65786368616e6765206d75737420626520656974686572206578706972656420908201527f6f722062652066696e697368656420627920746865206461746120726571756560648201527f7374657200000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b8201805460ff1916905560038201546001830154610c9291612228565b6002830154604051919250600160a060020a03169082156108fc029083906000818181858888f193505050501515610cc957600080fd5b610cd1612235565b60405183907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2505050565b600c546000908210610d4b576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805483908110610d5957fe5b60009182526020909120600d90910201600b81015490915060ff166002811115610d7f57fe5b600114610de4576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8054600160a060020a03163314610e45576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b80600c0154610e52612205565b11610ea7576040805160e560020a62461bcd02815260206004820152601860248201527f65786368616e6765206d75737420626520657870697265640000000000000000604482015290519081900360640190fd5b600b8101805460ff1916905580546001820154604051600160a060020a03909216916108fc82150291906000818181858888f193505050501515610eea57600080fd5b610ef2612235565b60405182907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a25050565b6201518081565b610f3181612251565b50565b600080610f4184846122c4565b915091509250929050565b60075460009060ff161580610f795750600160a060020a03821660009081526008602052604090205460ff165b80610f9c5750610f876122f8565b600160a060020a031682600160a060020a0316145b92915050565b60006060610f41848461231d565b610f31816123e7565b610fc16122f8565b600160a060020a03163314610fd557600080fd5b6007805460ff19168215159081179091556040517f6e1eb3fa845047cf9d5fd1deb1b7770b4e26163dd4d88cefb14fe7964a70059590600090a250565b610f318161245d565b60006060600061102b85856124bf565b9250925092509250925092565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061258f945050505050565b505050565b6110818282612629565b5050565b61108d6126ad565b600160a060020a031633146110a157600080fd5b6110a96126d2565b156110fe576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6111066126ad565b600160a060020a03166111176122f8565b600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361115c6111576126ad565b6126f7565b611166600061271b565b565b61117133610f4c565b151561117c57600080fd5b6040805180820182526001808252436020808401918252336000818152600683528681208a82529092528582209451855460ff191690151517855591519390920192909255915185927fcbde9cd310365ff3de3ad9cb44ed688d8880c7b1d15df733a73880fb84d032de91a3505050565b610f318161273f565b60075460ff165b90565b610f31816127b5565b60006060610f418484612837565b6110728383838080601f016020809104026020016040519081016040528093929190818152602001838380828437506128c3945050505050565b6112596122f8565b600160a060020a0316331461126d57600080fd5b600160a060020a038116600081815260086020526040808220805460ff19169055517f5bf47f016603dfff957e6086bd9a350212686e8f1d9208b3db47c5a3107c78789190a250565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061295d945050505050565b600c8054829081106112fe57fe5b6000918252602091829020600d90910201805460018083015460028085015460038601546004870154600588015460068901805460408051601f6000199b841615610100029b909b01909216979097049889018c90048c0281018c01909652878652600160a060020a039889169b509599938816989297919091169590949193928301828280156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815295969395939450908301828280156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050506009840154600a850154600b860154600c909601549495919490935060ff90911691508d565b6114986122f8565b600160a060020a031633146114ac57600080fd5b6114b46126d2565b15611509576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6115116122f8565b600160a060020a03167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a261116660006126f7565b600080610f4184846129f7565b600080610f418484612a2a565b600c5490565b600c5460009083106115ba576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c8054849081106115c857fe5b60009182526020909120600d909102016002810154909150600160a060020a0316331461163f576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070617373706f7274206f776e657220616c6c6f7765640000000000604482015290519081900360640190fd5b600b81015460ff16600281111561165257fe5b6001146116b7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b6001810154341015611739576040805160e560020a62461bcd02815260206004820152602c60248201527f6e65656420746f207374616b65206174206c656173742064617461207265717560448201527f657374657220616d6f756e740000000000000000000000000000000000000000606482015290519081900360840190fd5b80600c0154611746612205565b1061179b576040805160e560020a62461bcd02815260206004820152601660248201527f65786368616e6765207374617465206578706972656400000000000000000000604482015290519081900360640190fd5b346003820155600a8101829055600b8101805460ff19166002179055620151806117c3612205565b01600c82015580546040513391600160a060020a03169085907f843dda373d0d243dce80a6cd203b9cbba8576d036c7eb937f9de36ebe6e8b02390600090a4505050565b600160a060020a031660009081526008602052604090205460ff1690565b610f3181612a5d565b60006118386122f8565b905090565b600080610f418484612ac4565b600080610f418484612af8565b61186033610f4c565b151561186b57600080fd5b336000818152600660209081526040808320858452909152808220805460ff19168155600101829055518392917f9b9532c8ba5879554dee7c3e9374bd26dbfb2f79cf7f247bcf90648fc81fc16491a350565b6110818282612b2d565b6118d06122f8565b600160a060020a031633146118e457600080fd5b600160a060020a038116600081815260086020526040808220805460ff19166001179055517fff8ac5f0e9cdc8f7ffbbc29ab1301ee649cf01cf7a6a9265a2d90587612c41759190a250565b6110818282612bc0565b600b5481565b600060606000806000611951612f59565b600061195d8c8c6124bf565b9650965096508615156119ba576040805160e560020a62461bcd02815260206004820152601760248201527f707269766174652064617461206d757374206578697374000000000000000000604482015290519081900360640190fd5b6119c26122f8565b93506101a06040519081016040528033600160a060020a0316815260200134815260200185600160a060020a03168152602001600081526020018d600160a060020a031681526020018c600019168152602001878152602001866000191681526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437505050928452505050602081018a9052604081018590526060016001815260200162015180611a7c612205565b019052600c8054600181018083556000929092528251600d9091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c781018054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff199182161782556020808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c885015560408701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c98501805491871691841691909117905560608701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8ca85015560808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cb850180549190961692169190911790935560a08501517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cc83015560c08501518051959750939487949193611c0a937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cd01920190612fc4565b5060e082015160078201556101008201518051611c31916008840191602090910190612fc4565b506101208201516009820155610140820151600a820155610160820151600b8201805460ff19166001836002811115611c6657fe5b021790555061018082015181600c0155505050611c81612c6e565b50600c5460405160001990910190600160a060020a03851690339083907fabe53237e9ea366da7fa5507ac62db22bd446d6b66bcff4a6d6c1b11e9af198390600090a4505050505050505050505050565b6110818282612c8b565b610f3181612d0e565b60006118386126ad565b60006060610f418484612d75565b611d398484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750889450612e019350505050565b50505050565b611d476122f8565b600160a060020a03163314611d5b57600080fd5b611d636126d2565b15611db8576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b610f318161271b565b610f3181612ebf565b6000806000806000600c8054905087101515611e1e576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805488908110611e2c57fe5b60009182526020909120600d90910201600b81015490955060ff166002811115611e5257fe5b600214611eb7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8454600160a060020a03163314611f18576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b84600c0154611f25612205565b10611f7a576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206d757374206e6f74206265206578706972656400000000604482015290519081900360640190fd5b60098501546040805160208082018a905282518083038201815291830192839052815191929182918401908083835b60208310611fc85780518252601f199092019160209182019101611fa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515612050576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206b65792068617368206d757374206d6174636800000000604482015290519081900360640190fd5b600a85015460078601546040805192891860208085018290528251808603820181529483019283905284519198509293928291908401908083835b602083106120aa5780518252601f19909201916020918201910161208b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600b8a01805460ff1916905560038a015460018b01549590911497506120fe94935091506122289050565b9150821561214d576002850154604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561213c57600080fd5b508354600160a060020a0316612190565b8454604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561218057600080fd5b506002840154600160a060020a03165b612198612235565b60405187907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2604051600160a060020a0382169084159089907f540941e0fc2370abde0bfa6ddbb49188469597e518416fa24327f39469c9b2ec90600090a450505050505050565b600042670214e8348c4f000081111561222057633b9aca0090045b8091505b5090565b81810182811015610f9c57fe5b600b805460001901908190551515611166576111666000612f35565b61225a33610f4c565b151561226557600080fd5b33600081815260208181526040808320858452909152808220805474ffffffffffffffffffffffffffffffffffffffffff19169055518392917fed9474c4702ee9da4d0d2085840fafed5912b8e13daf1d6ea341ebe98803aec291a350565b600160a060020a0391909116600090815260066020908152604080832093835292905220805460019091015460ff90911691565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d225490565b600160a060020a038216600090815260096020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b820191906000526020600020905b8154815290600101906020018083116123b757829003601f168201915b5050505050905092509250509250929050565b6123f033610f4c565b15156123fb57600080fd5b3360009081526009602090815260408083208484529091528120805460ff191681559061242b600183018261303e565b5050604051819033907f140278d2322b9671bf293aea878e7717c46d5b7cd955e3e426ee67e01b90165490600090a350565b61246633610f4c565b151561247157600080fd5b336000818152600360209081526040808320858452909152808220805461ffff19169055518392917f191bd7fc1f22ce6b74b7d7e42126f0ed225b109728607c99971de9e78b0db6eb91a350565b600160a060020a0382166000908152600a6020908152604080832084845282528083208054600280830154600180850180548751601f93821615610100026000190190911694909404918201889004880284018801909652808352606096889660ff909516949391849183018282801561257a5780601f1061254f5761010080835404028352916020019161257a565b820191906000526020600020905b81548152906001019060200180831161255d57829003601f168201915b50505050509150935093509350509250925092565b61259833610f4c565b15156125a357600080fd5b60408051808201825260018082526020808301858152336000908152600583528581208882528352949094208351815460ff1916901515178155935180519394936125f5938501929190910190612fc4565b505060405183915033907fee56af66250a5cbba377132a356dc403d520776e30969594927024c44af8440b90600090a35050565b61263233610f4c565b151561263d57600080fd5b60408051808201825260018082526020808301858152336000818152600284528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fdb4ad6a3ed2bdacbae02da45a5bb54192cdb7d72648674d13e08d2fc4c45ac6691a35050565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb525490565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a5490565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb5255565b61274833610f4c565b151561275357600080fd5b3360009081526005602090815260408083208484529091528120805460ff1916815590612783600183018261303e565b5050604051819033907f0eaf95ab41777ff88e28181b1c43418524616bcef6d37c3b216015b5548cb10890600090a350565b6127be33610f4c565b15156127c957600080fd5b336000908152600a602090815260408083208484529091528120805460ff191681559060018201816127fb828261303e565b5060006001919091018190556040518493503392507f9cad6db22e9f7e2a3441e18ef08567fa48da09796f593ded4222f0a315f986019190a350565b600160a060020a038216600090815260056020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b6128cc33610f4c565b15156128d757600080fd5b60408051808201825260018082526020808301858152336000908152600983528581208882528352949094208351815460ff191690151517815593518051939493612929938501929190910190612fc4565b505060405183915033907fdb23beee028623a85d5af1d247423ca471d20e499b131cd5e5c76277eaa2ad5b90600090a35050565b61296633610f4c565b151561297157600080fd5b60408051808201825260018082526020808301858152336000908152600483528581208882528352949094208351815460ff1916901515178155935180519394936129c3938501929190910190612fc4565b505060405183915033907f43e6b7e3323b4598401023341c086c07c3ff5577f594b5aab9c065f2c3c9d59090600090a35050565b600160a060020a03919091166000908152600160208181526040808420948452939052919020805491015460ff90911691565b600160a060020a03918216600090815260208181526040808320938352929052205460ff81169261010090910490911690565b612a6633610f4c565b1515612a7157600080fd5b336000818152600260209081526040808320858452909152808220805460ff19168155600101829055518392917f3c3ff48e02e407eb1e78310d11b5e3f9e735263a9cafc2bcf4aa981b8ecb32a591a350565b600160a060020a0391909116600090815260026020908152604080832093835292905220805460019091015460ff90911691565b600160a060020a03919091166000908152600360209081526040808320938352929052205460ff808216926101009092041690565b612b3633610f4c565b1515612b4157600080fd5b6040805180820182526001815282151560208083019182523360008181526003835285812088825290925284822093518454935115156101000261ff001991151560ff1990951694909417169290921790925591518492917f68cc3496efaac4c1f2c0cd52da916138f6c5fc541992f05d97423a89b6914ae591a35050565b612bc933610f4c565b1515612bd457600080fd5b60408051808201825260018152600160a060020a03838116602080840191825233600081815280835286812089825290925285822094518554935160ff199094169015151774ffffffffffffffffffffffffffffffffffffffff001916610100939094169290920292909217909255915184927f8e7e6ab6c4613205e833e1faf5415d78dd10130a8828f729c08036e2a7a6277091a35050565b600b80546001908101918290551415611166576111666001612f35565b612c9433610f4c565b1515612c9f57600080fd5b604080518082018252600180825260208083018581523360008181528484528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fff76cb7634629f8d05011ab2a58380dfc0743157a70ba4173f866e113eca75c091a35050565b612d1733610f4c565b1515612d2257600080fd5b336000818152600160208181526040808420868552909152808320805460ff19168155909101829055518392917fd5f853f7aaba549b5a46be1de24cac4c20e716b4c603d24b2b0b7b5d97ca1c4d91a350565b600160a060020a038216600090815260046020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b612e0a33610f4c565b1515612e1557600080fd5b6040805180820182526001808252825180840184528581526020808201869052808401918252336000908152600a82528581208982528252949094208351815460ff1916901515178155905180518051949592949193850192612e7d92849290910190612fc4565b50602091909101516001909101555050604051839033907f0ed4013fbc8174781b18a7aa1cce7d589bc1fc3509941835787881ed2ab8b48e90600090a3505050565b612ec833610f4c565b1515612ed357600080fd5b3360009081526004602090815260408083208484529091528120805460ff1916815590612f03600183018261303e565b5050604051819033907f491a0e0281af9fc88ff024cffc24db22eddd4f826cb30d84936592967dc9237c90600090a350565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a55565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820181905260e0820183905261010082015261012081018290526101408101829052906101608201908152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061300557805160ff1916838001178555613032565b82800160010185558215613032579182015b82811115613032578251825591602001919060010190613017565b5061222492915061307e565b50805460018160011615610100020316600290046000825580601f106130645750610f31565b601f016020900490600052602060002090810190610f3191905b6111fd91905b8082111561222457600081556001016130845600696e76616c69642065786368616e676520696e64657800000000000000000000a165627a7a7230582041a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a0029

Deployed Bytecode

0x6080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306427a88811461024a57806308c50498146102645780630a2565251461027c5780630e14a376146102a3578063174a6277146102bb57806320888158146102fa57806322b96b631461032f578063257781e7146103d65780632b42a89a146103ee5780632c62ff2d146104085780632db27bd2146104205780632e28d084146104cb5780633e49bed0146104ef5780634e71e0c81461050a5780635b2a372d1461051f578063616b59f61461054357806361a2d0761461055b57806363019d1d146105705780636556f767146105885780636bfc8bb5146105ac5780636d4e7802146105d05780636e899550146105f15780636f618f9a14610615578063715018a6146107bc57806371658552146107d15780637ac4ed64146107f55780637dd291e41461083c57806386ca9a7c146108515780638ae44a081461085f5780638c160095146108805780638da5cb5b1461089857806395ee8bae146108c95780639d74b37d146108ed578063a2b6cbe11461092c578063ab338e361461027c578063abfdcced14610944578063ac0aeb1a14610961578063ca446dd914610982578063caa95f1b146109a6578063cea332cc146109bb578063e2a4853a146109e2578063e2b202bf146109fd578063e30c397814610a15578063e318de7314610a2a578063e75a836a14610a4e578063f2fde38b14610a75578063f6bb3cc414610a96578063fc2d058414610aae575b600080fd5b34801561025657600080fd5b50610262600435610ac9565b005b34801561027057600080fd5b50610262600435610d01565b34801561028857600080fd5b50610291610f21565b60408051918252519081900360200190f35b3480156102af57600080fd5b50610262600435610f28565b3480156102c757600080fd5b506102df600160a060020a0360043516602435610f34565b60408051921515835260208301919091528051918290030190f35b34801561030657600080fd5b5061031b600160a060020a0360043516610f4c565b604080519115158252519081900360200190f35b34801561033b57600080fd5b50610353600160a060020a0360043516602435610fa2565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039a578181015183820152602001610382565b50505050905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156103e257600080fd5b50610262600435610fb0565b3480156103fa57600080fd5b506102626004351515610fb9565b34801561041457600080fd5b50610262600435611012565b34801561042c57600080fd5b50610444600160a060020a036004351660243561101b565b604080518415158152908101829052606060208083018281528551928401929092528451608084019186019080838360005b8381101561048e578181015183820152602001610476565b50505050905090810190601f1680156104bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156104d757600080fd5b50610262600480359060248035908101910135611038565b3480156104fb57600080fd5b50610262600435602435611077565b34801561051657600080fd5b50610262611085565b34801561052b57600080fd5b50610262600480359060248035908101910135611168565b34801561054f57600080fd5b506102626004356111ed565b34801561056757600080fd5b5061031b6111f6565b34801561057c57600080fd5b50610262600435611200565b34801561059457600080fd5b50610353600160a060020a0360043516602435611209565b3480156105b857600080fd5b50610262600480359060248035908101910135611217565b3480156105dc57600080fd5b50610262600160a060020a0360043516611251565b3480156105fd57600080fd5b506102626004803590602480359081019101356112b6565b34801561062157600080fd5b5061062d6004356112f0565b604051808e600160a060020a0316600160a060020a031681526020018d81526020018c600160a060020a0316600160a060020a031681526020018b81526020018a600160a060020a0316600160a060020a03168152602001896000191660001916815260200180602001886000191660001916815260200180602001876000191660001916815260200186600019166000191681526020018560028111156106d157fe5b60ff16815260200184815260200183810383528a818151815260200191508051906020019080838360005b838110156107145781810151838201526020016106fc565b50505050905090810190601f1680156107415780820380516001836020036101000a031916815260200191505b5083810382528851815288516020918201918a019080838360005b8381101561077457818101518382015260200161075c565b50505050905090810190601f1680156107a15780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b3480156107c857600080fd5b50610262611490565b3480156107dd57600080fd5b506102df600160a060020a0360043516602435611550565b34801561080157600080fd5b50610819600160a060020a036004351660243561155d565b604080519215158352600160a060020a0390911660208301528051918290030190f35b34801561084857600080fd5b5061029161156a565b610262600435602435611570565b34801561086b57600080fd5b5061031b600160a060020a0360043516611807565b34801561088c57600080fd5b50610262600435611825565b3480156108a457600080fd5b506108ad61182e565b60408051600160a060020a039092168252519081900360200190f35b3480156108d557600080fd5b506102df600160a060020a036004351660243561183d565b3480156108f957600080fd5b50610911600160a060020a036004351660243561184a565b60408051921515835290151560208301528051918290030190f35b34801561093857600080fd5b50610262600435611857565b34801561095057600080fd5b5061026260043560243515156118be565b34801561096d57600080fd5b50610262600160a060020a03600435166118c8565b34801561098e57600080fd5b50610262600435600160a060020a0360243516611930565b3480156109b257600080fd5b5061029161193a565b61026260048035600160a060020a0316906024803591604435918201910135606435611940565b3480156109ee57600080fd5b50610262600435602435611cd2565b348015610a0957600080fd5b50610262600435611cdc565b348015610a2157600080fd5b506108ad611ce5565b348015610a3657600080fd5b50610353600160a060020a0360043516602435611cef565b348015610a5a57600080fd5b50610262600480359060248035908101910135604435611cfd565b348015610a8157600080fd5b50610262600160a060020a0360043516611d3f565b348015610aa257600080fd5b50610262600435611dc1565b348015610aba57600080fd5b50610262600435602435611dca565b600c5460009081908310610b15576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805484908110610b2357fe5b60009182526020909120600d90910201600b81015490925060ff166002811115610b4957fe5b600214610bae576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b81600c0154610bbb612205565b1180610bd057508154600160a060020a031633145b1515610c73576040805160e560020a62461bcd028152602060048201526044602482018190527f65786368616e6765206d75737420626520656974686572206578706972656420908201527f6f722062652066696e697368656420627920746865206461746120726571756560648201527f7374657200000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b8201805460ff1916905560038201546001830154610c9291612228565b6002830154604051919250600160a060020a03169082156108fc029083906000818181858888f193505050501515610cc957600080fd5b610cd1612235565b60405183907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2505050565b600c546000908210610d4b576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805483908110610d5957fe5b60009182526020909120600d90910201600b81015490915060ff166002811115610d7f57fe5b600114610de4576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8054600160a060020a03163314610e45576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b80600c0154610e52612205565b11610ea7576040805160e560020a62461bcd02815260206004820152601860248201527f65786368616e6765206d75737420626520657870697265640000000000000000604482015290519081900360640190fd5b600b8101805460ff1916905580546001820154604051600160a060020a03909216916108fc82150291906000818181858888f193505050501515610eea57600080fd5b610ef2612235565b60405182907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a25050565b6201518081565b610f3181612251565b50565b600080610f4184846122c4565b915091509250929050565b60075460009060ff161580610f795750600160a060020a03821660009081526008602052604090205460ff165b80610f9c5750610f876122f8565b600160a060020a031682600160a060020a0316145b92915050565b60006060610f41848461231d565b610f31816123e7565b610fc16122f8565b600160a060020a03163314610fd557600080fd5b6007805460ff19168215159081179091556040517f6e1eb3fa845047cf9d5fd1deb1b7770b4e26163dd4d88cefb14fe7964a70059590600090a250565b610f318161245d565b60006060600061102b85856124bf565b9250925092509250925092565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061258f945050505050565b505050565b6110818282612629565b5050565b61108d6126ad565b600160a060020a031633146110a157600080fd5b6110a96126d2565b156110fe576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6111066126ad565b600160a060020a03166111176122f8565b600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361115c6111576126ad565b6126f7565b611166600061271b565b565b61117133610f4c565b151561117c57600080fd5b6040805180820182526001808252436020808401918252336000818152600683528681208a82529092528582209451855460ff191690151517855591519390920192909255915185927fcbde9cd310365ff3de3ad9cb44ed688d8880c7b1d15df733a73880fb84d032de91a3505050565b610f318161273f565b60075460ff165b90565b610f31816127b5565b60006060610f418484612837565b6110728383838080601f016020809104026020016040519081016040528093929190818152602001838380828437506128c3945050505050565b6112596122f8565b600160a060020a0316331461126d57600080fd5b600160a060020a038116600081815260086020526040808220805460ff19169055517f5bf47f016603dfff957e6086bd9a350212686e8f1d9208b3db47c5a3107c78789190a250565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061295d945050505050565b600c8054829081106112fe57fe5b6000918252602091829020600d90910201805460018083015460028085015460038601546004870154600588015460068901805460408051601f6000199b841615610100029b909b01909216979097049889018c90048c0281018c01909652878652600160a060020a039889169b509599938816989297919091169590949193928301828280156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815295969395939450908301828280156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050506009840154600a850154600b860154600c909601549495919490935060ff90911691508d565b6114986122f8565b600160a060020a031633146114ac57600080fd5b6114b46126d2565b15611509576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6115116122f8565b600160a060020a03167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a261116660006126f7565b600080610f4184846129f7565b600080610f418484612a2a565b600c5490565b600c5460009083106115ba576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c8054849081106115c857fe5b60009182526020909120600d909102016002810154909150600160a060020a0316331461163f576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070617373706f7274206f776e657220616c6c6f7765640000000000604482015290519081900360640190fd5b600b81015460ff16600281111561165257fe5b6001146116b7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b6001810154341015611739576040805160e560020a62461bcd02815260206004820152602c60248201527f6e65656420746f207374616b65206174206c656173742064617461207265717560448201527f657374657220616d6f756e740000000000000000000000000000000000000000606482015290519081900360840190fd5b80600c0154611746612205565b1061179b576040805160e560020a62461bcd02815260206004820152601660248201527f65786368616e6765207374617465206578706972656400000000000000000000604482015290519081900360640190fd5b346003820155600a8101829055600b8101805460ff19166002179055620151806117c3612205565b01600c82015580546040513391600160a060020a03169085907f843dda373d0d243dce80a6cd203b9cbba8576d036c7eb937f9de36ebe6e8b02390600090a4505050565b600160a060020a031660009081526008602052604090205460ff1690565b610f3181612a5d565b60006118386122f8565b905090565b600080610f418484612ac4565b600080610f418484612af8565b61186033610f4c565b151561186b57600080fd5b336000818152600660209081526040808320858452909152808220805460ff19168155600101829055518392917f9b9532c8ba5879554dee7c3e9374bd26dbfb2f79cf7f247bcf90648fc81fc16491a350565b6110818282612b2d565b6118d06122f8565b600160a060020a031633146118e457600080fd5b600160a060020a038116600081815260086020526040808220805460ff19166001179055517fff8ac5f0e9cdc8f7ffbbc29ab1301ee649cf01cf7a6a9265a2d90587612c41759190a250565b6110818282612bc0565b600b5481565b600060606000806000611951612f59565b600061195d8c8c6124bf565b9650965096508615156119ba576040805160e560020a62461bcd02815260206004820152601760248201527f707269766174652064617461206d757374206578697374000000000000000000604482015290519081900360640190fd5b6119c26122f8565b93506101a06040519081016040528033600160a060020a0316815260200134815260200185600160a060020a03168152602001600081526020018d600160a060020a031681526020018c600019168152602001878152602001866000191681526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437505050928452505050602081018a9052604081018590526060016001815260200162015180611a7c612205565b019052600c8054600181018083556000929092528251600d9091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c781018054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff199182161782556020808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c885015560408701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c98501805491871691841691909117905560608701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8ca85015560808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cb850180549190961692169190911790935560a08501517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cc83015560c08501518051959750939487949193611c0a937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cd01920190612fc4565b5060e082015160078201556101008201518051611c31916008840191602090910190612fc4565b506101208201516009820155610140820151600a820155610160820151600b8201805460ff19166001836002811115611c6657fe5b021790555061018082015181600c0155505050611c81612c6e565b50600c5460405160001990910190600160a060020a03851690339083907fabe53237e9ea366da7fa5507ac62db22bd446d6b66bcff4a6d6c1b11e9af198390600090a4505050505050505050505050565b6110818282612c8b565b610f3181612d0e565b60006118386126ad565b60006060610f418484612d75565b611d398484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750889450612e019350505050565b50505050565b611d476122f8565b600160a060020a03163314611d5b57600080fd5b611d636126d2565b15611db8576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b610f318161271b565b610f3181612ebf565b6000806000806000600c8054905087101515611e1e576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805488908110611e2c57fe5b60009182526020909120600d90910201600b81015490955060ff166002811115611e5257fe5b600214611eb7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8454600160a060020a03163314611f18576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b84600c0154611f25612205565b10611f7a576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206d757374206e6f74206265206578706972656400000000604482015290519081900360640190fd5b60098501546040805160208082018a905282518083038201815291830192839052815191929182918401908083835b60208310611fc85780518252601f199092019160209182019101611fa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515612050576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206b65792068617368206d757374206d6174636800000000604482015290519081900360640190fd5b600a85015460078601546040805192891860208085018290528251808603820181529483019283905284519198509293928291908401908083835b602083106120aa5780518252601f19909201916020918201910161208b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600b8a01805460ff1916905560038a015460018b01549590911497506120fe94935091506122289050565b9150821561214d576002850154604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561213c57600080fd5b508354600160a060020a0316612190565b8454604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561218057600080fd5b506002840154600160a060020a03165b612198612235565b60405187907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2604051600160a060020a0382169084159089907f540941e0fc2370abde0bfa6ddbb49188469597e518416fa24327f39469c9b2ec90600090a450505050505050565b600042670214e8348c4f000081111561222057633b9aca0090045b8091505b5090565b81810182811015610f9c57fe5b600b805460001901908190551515611166576111666000612f35565b61225a33610f4c565b151561226557600080fd5b33600081815260208181526040808320858452909152808220805474ffffffffffffffffffffffffffffffffffffffffff19169055518392917fed9474c4702ee9da4d0d2085840fafed5912b8e13daf1d6ea341ebe98803aec291a350565b600160a060020a0391909116600090815260066020908152604080832093835292905220805460019091015460ff90911691565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d225490565b600160a060020a038216600090815260096020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b820191906000526020600020905b8154815290600101906020018083116123b757829003601f168201915b5050505050905092509250509250929050565b6123f033610f4c565b15156123fb57600080fd5b3360009081526009602090815260408083208484529091528120805460ff191681559061242b600183018261303e565b5050604051819033907f140278d2322b9671bf293aea878e7717c46d5b7cd955e3e426ee67e01b90165490600090a350565b61246633610f4c565b151561247157600080fd5b336000818152600360209081526040808320858452909152808220805461ffff19169055518392917f191bd7fc1f22ce6b74b7d7e42126f0ed225b109728607c99971de9e78b0db6eb91a350565b600160a060020a0382166000908152600a6020908152604080832084845282528083208054600280830154600180850180548751601f93821615610100026000190190911694909404918201889004880284018801909652808352606096889660ff909516949391849183018282801561257a5780601f1061254f5761010080835404028352916020019161257a565b820191906000526020600020905b81548152906001019060200180831161255d57829003601f168201915b50505050509150935093509350509250925092565b61259833610f4c565b15156125a357600080fd5b60408051808201825260018082526020808301858152336000908152600583528581208882528352949094208351815460ff1916901515178155935180519394936125f5938501929190910190612fc4565b505060405183915033907fee56af66250a5cbba377132a356dc403d520776e30969594927024c44af8440b90600090a35050565b61263233610f4c565b151561263d57600080fd5b60408051808201825260018082526020808301858152336000818152600284528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fdb4ad6a3ed2bdacbae02da45a5bb54192cdb7d72648674d13e08d2fc4c45ac6691a35050565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb525490565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a5490565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb5255565b61274833610f4c565b151561275357600080fd5b3360009081526005602090815260408083208484529091528120805460ff1916815590612783600183018261303e565b5050604051819033907f0eaf95ab41777ff88e28181b1c43418524616bcef6d37c3b216015b5548cb10890600090a350565b6127be33610f4c565b15156127c957600080fd5b336000908152600a602090815260408083208484529091528120805460ff191681559060018201816127fb828261303e565b5060006001919091018190556040518493503392507f9cad6db22e9f7e2a3441e18ef08567fa48da09796f593ded4222f0a315f986019190a350565b600160a060020a038216600090815260056020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b6128cc33610f4c565b15156128d757600080fd5b60408051808201825260018082526020808301858152336000908152600983528581208882528352949094208351815460ff191690151517815593518051939493612929938501929190910190612fc4565b505060405183915033907fdb23beee028623a85d5af1d247423ca471d20e499b131cd5e5c76277eaa2ad5b90600090a35050565b61296633610f4c565b151561297157600080fd5b60408051808201825260018082526020808301858152336000908152600483528581208882528352949094208351815460ff1916901515178155935180519394936129c3938501929190910190612fc4565b505060405183915033907f43e6b7e3323b4598401023341c086c07c3ff5577f594b5aab9c065f2c3c9d59090600090a35050565b600160a060020a03919091166000908152600160208181526040808420948452939052919020805491015460ff90911691565b600160a060020a03918216600090815260208181526040808320938352929052205460ff81169261010090910490911690565b612a6633610f4c565b1515612a7157600080fd5b336000818152600260209081526040808320858452909152808220805460ff19168155600101829055518392917f3c3ff48e02e407eb1e78310d11b5e3f9e735263a9cafc2bcf4aa981b8ecb32a591a350565b600160a060020a0391909116600090815260026020908152604080832093835292905220805460019091015460ff90911691565b600160a060020a03919091166000908152600360209081526040808320938352929052205460ff808216926101009092041690565b612b3633610f4c565b1515612b4157600080fd5b6040805180820182526001815282151560208083019182523360008181526003835285812088825290925284822093518454935115156101000261ff001991151560ff1990951694909417169290921790925591518492917f68cc3496efaac4c1f2c0cd52da916138f6c5fc541992f05d97423a89b6914ae591a35050565b612bc933610f4c565b1515612bd457600080fd5b60408051808201825260018152600160a060020a03838116602080840191825233600081815280835286812089825290925285822094518554935160ff199094169015151774ffffffffffffffffffffffffffffffffffffffff001916610100939094169290920292909217909255915184927f8e7e6ab6c4613205e833e1faf5415d78dd10130a8828f729c08036e2a7a6277091a35050565b600b80546001908101918290551415611166576111666001612f35565b612c9433610f4c565b1515612c9f57600080fd5b604080518082018252600180825260208083018581523360008181528484528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fff76cb7634629f8d05011ab2a58380dfc0743157a70ba4173f866e113eca75c091a35050565b612d1733610f4c565b1515612d2257600080fd5b336000818152600160208181526040808420868552909152808320805460ff19168155909101829055518392917fd5f853f7aaba549b5a46be1de24cac4c20e716b4c603d24b2b0b7b5d97ca1c4d91a350565b600160a060020a038216600090815260046020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b612e0a33610f4c565b1515612e1557600080fd5b6040805180820182526001808252825180840184528581526020808201869052808401918252336000908152600a82528581208982528252949094208351815460ff1916901515178155905180518051949592949193850192612e7d92849290910190612fc4565b50602091909101516001909101555050604051839033907f0ed4013fbc8174781b18a7aa1cce7d589bc1fc3509941835787881ed2ab8b48e90600090a3505050565b612ec833610f4c565b1515612ed357600080fd5b3360009081526004602090815260408083208484529091528120805460ff1916815590612f03600183018261303e565b5050604051819033907f491a0e0281af9fc88ff024cffc24db22eddd4f826cb30d84936592967dc9237c90600090a350565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a55565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820181905260e0820183905261010082015261012081018290526101408101829052906101608201908152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061300557805160ff1916838001178555613032565b82800160010185558215613032579182015b82811115613032578251825591602001919060010190613017565b5061222492915061307e565b50805460018160011615610100020316600290046000825580601f106130645750610f31565b601f016020900490600052602060002090810190610f3191905b6111fd91905b8082111561222457600081556001016130845600696e76616c69642065786368616e676520696e64657800000000000000000000a165627a7a7230582041a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a0029

Deployed Bytecode Sourcemap

41921:257:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36313:894;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36313:894:0;;;;;;;37276:823;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37276:823:0;;;;;32263:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32263:65:0;;;;;;;;;;;;;;;;;;;;17547:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17547:85:0;;;;;27791:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27791:190:0;-1:-1:-1;;;;;27791:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15501:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15501:201:0;-1:-1:-1;;;;;15501:201:0;;;;;;;;;;;;;;;;;;;;;;;28993:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28993:168:0;-1:-1:-1;;;;;28993:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28993:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28806:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28806:87:0;;;;;16025:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16025:206:0;;;;;;;22218:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22218:79:0;;;;;32969:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32969:214:0;-1:-1:-1;;;;;32969:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32969:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25220:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25220:97:0;;;;;;;;;;;;;;;;20544:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20544:91:0;;;;;;;6087:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6087:220:0;;;;27148:310;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27148:310:0;;;;;;;;;;;;;;;;25369:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25369:81:0;;;;;15797:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15797:131:0;;;;32764:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32764:105:0;;;;;25550:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25550:161:0;-1:-1:-1;;;;;25550:161:0;;;;;;;28650:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28650:104:0;;;;;;;;;;;;;;;;16815:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16815:189:0;-1:-1:-1;;;;;16815:189:0;;;;;23628:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23628:100:0;;;;;;;;;;;;;;;;14668:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14668:49:0;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3079:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3079:147:0;;;;19325:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19325:158:0;-1:-1:-1;;;;;19325:158:0;;;;;;;17732:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17732:167:0;-1:-1:-1;;;;;17732:167:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17732:167:0;;;;;;;;;;;;;;;;33276:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33276:133:0;;;;35229:1015;;;;;;;;16323:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16323:139:0;-1:-1:-1;;;;;16323:139:0;;;;;20687:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20687:77:0;;;;;3939:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3939:84:0;;;;;;;;-1:-1:-1;;;;;3939:84:0;;;;;;;;;;;;;;20864:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20864:155:0;-1:-1:-1;;;;;20864:155:0;;;;;;;22397:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22397:158:0;-1:-1:-1;;;;;22397:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27510:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27510:181:0;;;;;22072:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22072:94:0;;;;;;;;;16545:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16545:182:0;-1:-1:-1;;;;;16545:182:0;;;;;17392:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17392:103:0;;;-1:-1:-1;;;;;17392:103:0;;;;;14514:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14514:41:0;;;;33685:1390;;;;;-1:-1:-1;;;;;33685:1390:0;;;;;;;;;;;;;;;;;;19000:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19000:94:0;;;;;;;19146:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19146:79:0;;;;;5403:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5403:98:0;;;;23963:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23963:164:0;-1:-1:-1;;;;;23963:164:0;;;;;;;32540:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32540:172:0;;;;;;;;;;;;;;;;;;5869:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5869:121:0;-1:-1:-1;;;;;5869:121:0;;;;;23780:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23780:83:0;;;;;38234:1624;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38234:1624:0;;;;;;;36313:894;36413:20;:27;36478:36;;;;36398:42;;36390:77;;;;;-1:-1:-1;;;;;36390:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36390:77:0;;;;;;;;;;;;;;;36517:20;:34;;36538:12;;36517:34;;;;;;;;;;;;;;;;;;;36607:14;;;;36517:34;;-1:-1:-1;36607:14:0;;36570:51;;;;;;;;:33;:51;36562:98;;;;;-1:-1:-1;;;;;36562:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36562:98:0;;;;;;;;;;;;;;;36695:8;:21;;;36679:13;:11;:13::i;:::-;:37;:77;;;-1:-1:-1;36734:22:0;;-1:-1:-1;;;;;36734:22:0;36720:10;:36;36679:77;36671:158;;;;;;;-1:-1:-1;;;;;36671:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36842:14;;;:48;;-1:-1:-1;;36842:48:0;;;37014:27;;;;36842:48;36982:27;;;:60;;:31;:60::i;:::-;37061:22;;;;:32;;36968:74;;-1:-1:-1;;;;;;37061:22:0;;:32;;;;;36968:74;;37061:22;:32;:22;:32;36968:74;37061:22;:32;;;;;;;37053:41;;;;;;;;37107:35;:33;:35::i;:::-;37160:39;;37186:12;;37160:39;;;;;36313:894;;;:::o;37276:823::-;37377:20;:27;37442:36;;37362:42;;37354:77;;;;;-1:-1:-1;;;;;37354:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37354:77:0;;;;;;;;;;;;;;;37481:20;:34;;37502:12;;37481:34;;;;;;;;;;;;;;;;;;;37571:14;;;;37481:34;;-1:-1:-1;37571:14:0;;37534:51;;;;;;;;:33;:51;37526:98;;;;;-1:-1:-1;;;;;37526:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37526:98:0;;;;;;;;;;;;;;;37657:22;;-1:-1:-1;;;;;37657:22:0;37643:10;:36;37635:76;;;;;-1:-1:-1;;;;;37635:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37746:8;:21;;;37730:13;:11;:13::i;:::-;:37;37722:74;;;;;-1:-1:-1;;;;;37722:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37809:14;;;:48;;-1:-1:-1;;37809:48:0;;;37929:22;;37809:48;37957:27;;;37929:56;;-1:-1:-1;;;;;37929:22:0;;;;:56;;;;;37957:27;37826:31;37929:56;37826:31;37929:56;37957:27;37929:22;:56;;;;;;;37921:65;;;;;;;;37999:35;:33;:35::i;:::-;38052:39;;38078:12;;38052:39;;;;;37276:823;;:::o;32263:65::-;32322:6;32263:65;:::o;17547:85::-;17604:20;17619:4;17604:14;:20::i;:::-;17547:85;:::o;27791:190::-;27881:12;27895:16;27931:42;27953:13;27968:4;27931:21;:42::i;:::-;27924:49;;;;27791:190;;;;;:::o;15501:201::-;15596:36;;15571:4;;15596:36;;15595:37;;:72;;-1:-1:-1;;;;;;15636:31:0;;;;;;:21;:31;;;;;;;;15595:72;:99;;;;15683:11;:9;:11::i;:::-;-1:-1:-1;;;;;15671:23:0;:8;-1:-1:-1;;;;;15671:23:0;;15595:99;15588:106;15501:201;-1:-1:-1;;15501:201:0:o;28993:168::-;29074:12;29088;29120:33;29133:13;29148:4;29120:12;:33::i;28806:87::-;28864:21;28880:4;28864:15;:21::i;16025:206::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;16112:36;:53;;-1:-1:-1;;16112:53:0;;;;;;;;;;16181:42;;;;-1:-1:-1;;16181:42:0;16025:206;:::o;22218:79::-;22272:17;22284:4;22272:11;:17::i;32969:214::-;33059:12;33073:19;33094;33133:42;33155:13;33170:4;33133:21;:42::i;:::-;33126:49;;;;;;32969:214;;;;;:::o;25220:97::-;25286:23;25296:4;25302:6;;25286:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25286:9:0;;-1:-1:-1;;;;;25286:23:0:i;:::-;25220:97;;;:::o;20544:91::-;20606:21;20614:4;20620:6;20606:7;:21::i;:::-;20544:91;;:::o;6087:220::-;5671:18;:16;:18::i;:::-;-1:-1:-1;;;;;5657:32:0;:10;:32;5649:41;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6201:18;:16;:18::i;:::-;-1:-1:-1;;;;;6167:53:0;6188:11;:9;:11::i;:::-;-1:-1:-1;;;;;6167:53:0;;;;;;;;;;;6231:29;6241:18;:16;:18::i;:::-;6231:9;:29::i;:::-;6271:28;6296:1;6271:16;:28::i;:::-;6087:220::o;27148:310::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;27296:107;;;;;;;;27342:4;27296:107;;;27375:12;27296:107;;;;;;;27276:10;-1:-1:-1;27261:26:0;;;:14;:26;;;;;:32;;;;;;;;;:142;;;;-1:-1:-1;;27261:142:0;;;;;;;;;;;;;;;;;27419:31;;27261:32;;27419:31;;;27148:310;;;:::o;25369:81::-;25424:18;25437:4;25424:12;:18::i;15797:131::-;15884:36;;;;15797:131;;:::o;32764:105::-;32831:30;32856:4;32831:24;:30::i;25550:161::-;25628:12;25642:11;25673:30;25683:13;25698:4;25673:9;:30::i;28650:104::-;28720:26;28733:4;28739:6;;28720:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28720:12:0;;-1:-1:-1;;;;;28720:26:0:i;16815:189::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;-1:-1:-1;;;;;16911:31:0;;;;;;:21;:31;;;;;;16904:38;;-1:-1:-1;;16904:38:0;;;16958;;;16911:31;16958:38;16815:189;:::o;23628:100::-;23696:24;23707:4;23713:6;;23696:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23696:10:0;;-1:-1:-1;;;;;23696:24:0:i;14668:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;14668:49:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;-1:-1:-1;14668:49:0;:::o;3079:147::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:11;:9;:11::i;:::-;-1:-1:-1;;;;;3155:31:0;;;;;;;;;;;3197:21;3215:1;3197:9;:21::i;19325:158::-;19402:12;19416:10;19446:29;19455:13;19470:4;19446:8;:29::i;17732:167::-;17812:12;17826:13;17859:32;17871:13;17886:4;17859:11;:32::i;33276:133::-;33374:20;:27;33276:133;:::o;35229:1015::-;35364:20;:27;35429:36;;35349:42;;35341:77;;;;;-1:-1:-1;;;;;35341:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35341:77:0;;;;;;;;;;;;;;;35468:20;:34;;35489:12;;35468:34;;;;;;;;;;;;;;;;;;;35535:22;;;;35468:34;;-1:-1:-1;;;;;;35535:22:0;35521:10;:36;35513:76;;;;;-1:-1:-1;;;;;35513:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35645:14;;;;;;35608:51;;;;;;;;:33;:51;35600:98;;;;;-1:-1:-1;;;;;35600:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35600:98:0;;;;;;;;;;;;;;;35730:27;;;;35717:9;:40;;35709:97;;;;;-1:-1:-1;;;;;35709:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35841:8;:21;;;35825:13;:11;:13::i;:::-;:37;35817:72;;;;;-1:-1:-1;;;;;35817:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35932:9;35902:27;;;:39;35952:25;;;:45;;;36008:14;;;:50;;-1:-1:-1;;36008:50:0;36025:33;36008:50;;;32322:6;36093:13;:11;:13::i;:::-;:48;36069:21;;;:72;36201:22;;36159:77;;36225:10;;-1:-1:-1;;;;;36201:22:0;;36187:12;;36159:77;;36201:22;;36159:77;35229:1015;;;:::o;16323:139::-;-1:-1:-1;;;;;16423:31:0;16399:4;16423:31;;;:21;:31;;;;;;;;;16323:139::o;20687:77::-;20740:16;20751:4;20740:10;:16::i;3939:84::-;3977:7;4004:11;:9;:11::i;:::-;3997:18;;3939:84;:::o;20864:155::-;20940:12;20954:9;20983:28;20991:13;21006:4;20983:7;:28::i;22397:158::-;22474:12;22488:10;22518:29;22527:13;22542:4;22518:8;:29::i;27510:181::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;27619:10;27604:26;;;;:14;:26;;;;;;;;:32;;;;;;;;;27597:39;;-1:-1:-1;;27597:39:0;;;;;;;;27652:31;27631:4;;27619:10;27652:31;;;27510:181;:::o;22072:94::-;22136:22;22145:4;22151:6;22136:8;:22::i;16545:182::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;-1:-1:-1;;;;;16629:31:0;;;;;;:21;:31;;;;;;:38;;-1:-1:-1;;16629:38:0;16663:4;16629:38;;;16683:36;;;16629:31;16683:36;16545:182;:::o;17392:103::-;17462:25;17474:4;17480:6;17462:11;:25::i;14514:41::-;;;;:::o;33685:1390::-;33885:12;33899:26;33927:19;34059:21;34105:24;34140:35;;:::i;:::-;34931:19;33950:42;33972:13;33987:4;33950:21;:42::i;:::-;33884:108;;;;;;34011:7;34003:43;;;;;;;-1:-1:-1;;;;;34003:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34083:11;:9;:11::i;:::-;34059:35;;34178:646;;;;;;;;;34229:10;-1:-1:-1;;;;;34178:646:0;;;;;34275:9;34178:646;;;;34315:13;-1:-1:-1;;;;;34178:646:0;;;;;34364:1;34178:646;;;;34395:13;-1:-1:-1;;;;;34178:646:0;;;;;34429:4;34178:646;;;;;;;34463:12;34178:646;;;;34504:11;34178:646;;;;;;;34553:21;;34178:646;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34178:646:0;;;-1:-1:-1;;;34178:646:0;;;;;;;;;;;;;;34696:33;34178:646;;;;32250:6;34759:13;:11;:13::i;:::-;:49;34178:646;;34835:20;27:10:-1;;39:1;23:18;;45:23;;;-1:-1;34835:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34835:35:0;;;-1:-1:-1;;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34140:684;;-1:-1:-1;23:18;;34140:684:0;;34835:35;;;;;;;;;;:::i;:::-;-1:-1:-1;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34883;:33;:35::i;:::-;-1:-1:-1;34953:20:0;:27;35000:67;;-1:-1:-1;;34953:31:0;;;;-1:-1:-1;;;;;35000:67:0;;;35041:10;;34953:31;;35000:67;;;;;33685:1390;;;;;;;;;;;;:::o;19000:94::-;19064:22;19073:4;19079:6;19064:8;:22::i;19146:79::-;19200:17;19212:4;19200:11;:17::i;5403:98::-;5448:7;5475:18;:16;:18::i;23963:164::-;24042:12;24056;24088:31;24099:13;24114:4;24088:10;:31::i;32540:172::-;32648:56;32670:4;32676:13;;32648:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32691:12:0;;-1:-1:-1;32648:21:0;;-1:-1:-1;;;;32648:56:0:i;:::-;32540:172;;;;:::o;5869:121::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5956:26;5973:8;5956:16;:26::i;23780:83::-;23836:19;23850:4;23836:13;:19::i;38234:1624::-;38422:36;38914:15;39041:17;39195:11;39282:15;38357:20;:27;;;;38342:12;:42;38334:77;;;;;;;-1:-1:-1;;;;;38334:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38334:77:0;;;;;;;;;;;;;;;38461:20;:34;;38482:12;;38461:34;;;;;;;;;;;;;;;;;;;38551:14;;;;38461:34;;-1:-1:-1;38551:14:0;;38514:51;;;;;;;;:33;:51;38506:98;;;;;-1:-1:-1;;;;;38506:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38506:98:0;;;;;;;;;;;;;;;38637:22;;-1:-1:-1;;;;;38637:22:0;38623:10;:36;38615:76;;;;;-1:-1:-1;;;;;38615:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38726:8;:21;;;38710:13;:11;:13::i;:::-;:37;38702:78;;;;;-1:-1:-1;;;;;38702:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38844:24;;;;38809:30;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;38809:30:0;;;;;;;38799:41;;38809:30;;;;;38799:41;;;;38809:30;38799:41;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;38799:41:0;;;;;;;;;;;;;;;;:69;;;;38791:110;;;;;;;-1:-1:-1;;;;;38791:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38947:25;;;;39101:20;;;;39071:25;;;38932:40;;;39071:25;;;;;;;;;26:21:-1;;;22:32;;6:49;;39071:25:0;;;;;;;39061:36;;38932:40;;-1:-1:-1;39101:20:0;;39071:25;;;39061:36;;;;;39071:25;39061:36;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;39061:36:0;;;;;;;;;;39134:14;;;:48;;-1:-1:-1;;39134:48:0;;;39241:27;;;;-1:-1:-1;39209:27:0;;;39061:60;;;;;-1:-1:-1;39209:60:0;;:27;-1:-1:-1;39241:27:0;-1:-1:-1;39209:31:0;;-1:-1:-1;39209:60:0:i;:::-;39195:74;;39312:12;39308:357;;;39400:22;;;;:32;;-1:-1:-1;;;;;39400:22:0;;;;:32;;;;;39428:3;;39400:22;:32;:22;:32;39428:3;39400:22;:32;;;;;;;39392:41;;;;;;;;-1:-1:-1;39458:22:0;;-1:-1:-1;;;;;39458:22:0;39308:357;;;39573:22;;:32;;-1:-1:-1;;;;;39573:22:0;;;;:32;;;;;39601:3;;39573:22;:32;:22;:32;39601:3;39573:22;:32;;;;;;;39565:41;;;;;;;;-1:-1:-1;39631:22:0;;;;-1:-1:-1;;;;;39631:22:0;39308:357;39677:35;:33;:35::i;:::-;39730:39;;39756:12;;39730:39;;;;;39785:65;;-1:-1:-1;;;;;39785:65:0;;;39827:13;;;39813:12;;39785:65;;;;;38234:1624;;;;;;;:::o;41433:391::-;41477:7;41509:3;41734:18;41730:22;;41726:70;;;41774:10;41769:15;;41726:70;41815:1;41808:8;;41433:391;;;:::o;31247:132::-;31329:7;;;31350;;;;31343:15;;;40147:268;40218:29;40216:31;;-1:-1:-1;;40216:31:0;;;;;:36;40212:196;;;40379:17;40390:5;40379:10;:17::i;18188:173::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;18288:10;18273:14;:26;;;;;;;;;;;:32;;;;;;;;;18266:39;;-1:-1:-1;;18266:39:0;;;18321:32;18300:4;;18288:10;18321:32;;;18188:173;:::o;27989:277::-;-1:-1:-1;;;;;28159:29:0;;;;28079:12;28159:29;;;:14;:29;;;;;;;;:35;;;;;;;28213:21;;;28236;;;;28213;;;;;27989:277::o;4084:164::-;2274:66;4219:11;;4197:44::o;29637:257::-;-1:-1:-1;;;;;29792:30:0;;29719:12;29792:30;;;:15;:30;;;;;;;;:36;;;;;;;;29847:21;;;29870:15;;;29839:47;;;;;;;;;;29847:21;29839:47;-1:-1:-1;;29839:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;29733:12;;29792:36;;29847:21;;;;;29870:15;;;;29839:47;;29870:15;29839:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29637:257;;;;;;:::o;29453:176::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;29555:10;29539:27;;;;:15;:27;;;;;;;;:33;;;;;;;;29532:40;;-1:-1:-1;;29532:40:0;;;29539:33;29532:40;;;;29539:27;29532:40;:::i;:::-;-1:-1:-1;;29588:33:0;;29616:4;;29604:10;;29588:33;;;;;29453:176;:::o;22829:164::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;22923:10;22911:23;;;;:11;:23;;;;;;;;:29;;;;;;;;;22904:36;;-1:-1:-1;;22904:36:0;;;22956:29;22935:4;;22923:10;22956:29;;;22829:164;:::o;41083:342::-;-1:-1:-1;;;;;41278:33:0;;41174:12;41278:33;;;:18;:33;;;;;;;;:39;;;;;;;;41336:21;;41389:27;;;;;41336:21;41359:15;;;41328:89;;;;;;;;;41336:21;41328:89;-1:-1:-1;;41328:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;41188:19;;41174:12;;41336:21;;;;;41359:15;41328:89;41359:15;;41328:89;;41359:15;41328:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41083:342;;;;;;:::o;25719:263::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;25839:89;;;;;;;;25879:4;25839:89;;;;;;;;;;25819:10;-1:-1:-1;25806:24:0;;;:12;:24;;;;;:30;;;;;;;;;:122;;;;-1:-1:-1;;25806:122:0;;;;;;;;;;;25839:89;;25806:30;:122;;;;;;;;;;;:::i;:::-;-1:-1:-1;;25944:30:0;;25969:4;;-1:-1:-1;25957:10:0;;25944:30;;;;;25719:263;;:::o;21027:253::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;21141:87;;;;;;;;21179:4;21141:87;;;;;;;;;;21121:10;-1:-1:-1;21110:22:0;;;:10;:22;;;;;:28;;;;;;;;;:118;;;;-1:-1:-1;;21110:118:0;;;;;;;;;;;;;;;;;21244:28;;21110;;21121:10;21244:28;;;21027:253;;:::o;6376:185::-;5106:66;6532:11;;6507:47::o;1266:175::-;470:66;1412:11;;1387:47::o;4381:161::-;2274:66;4501:23;4486:49::o;6705:190::-;5106:66;6847:30;6832:56::o;25990:167::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;26086:10;26073:24;;;;:12;:24;;;;;;;;:30;;;;;;;;26066:37;;-1:-1:-1;;26066:37:0;;;26073:30;26066:37;;;;26073:24;26066:37;:::i;:::-;-1:-1:-1;;26119:30:0;;26144:4;;26132:10;;26119:30;;;;;25990:167;:::o;40878:197::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;40992:10;40973:30;;;;:18;:30;;;;;;;;:36;;;;;;;;40966:43;;-1:-1:-1;;40966:43:0;;;40973:36;40966:43;;;40973:30;40966:43;;40973:30;40966:43;:::i;:::-;-1:-1:-1;40966:43:0;;;;;;;;;41025:42;;41062:4;;-1:-1:-1;41050:10:0;;-1:-1:-1;41025:42:0;;40966:43;41025:42;40878:197;:::o;26165:247::-;-1:-1:-1;;;;;26313:27:0;;26244:12;26313:27;;;:12;:27;;;;;;;;:33;;;;;;;;26365:21;;;26388:15;;;26357:47;;;;;;;;;;26365:21;26357:47;-1:-1:-1;;26357:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;26258:11;;26313:33;;26365:21;;;;;26388:15;;;;26357:47;;26388:15;26357:47;;;;;;;;;;;;;;;;;;;;;;;;29169:276;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;29296:92;;;;;;;;29339:4;29296:92;;;;;;;;;;29276:10;-1:-1:-1;29260:27:0;;;:15;:27;;;;;:33;;;;;;;;;:128;;;;-1:-1:-1;;29260:128:0;;;;;;;;;;;29296:92;;29260:33;:128;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29404:33:0;;29432:4;;-1:-1:-1;29420:10:0;;29404:33;;;;;29169:276;;:::o;24135:268::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;24258:90;;;;;;;;24299:4;24258:90;;;;;;;;;;24238:10;-1:-1:-1;24224:25:0;;;:13;:25;;;;;:31;;;;;;;;;:124;;;;-1:-1:-1;;24224:124:0;;;;;;;;;;;24258:90;;24224:31;:124;;;;;;;;;;;:::i;:::-;-1:-1:-1;;24364:31:0;;24390:4;;-1:-1:-1;24378:10:0;;24364:31;;;;;24135:268;;:::o;19929:243::-;-1:-1:-1;;;;;20074:26:0;;;;20007:12;20074:26;;;:11;:26;;;;;;;;:32;;;;;;;;;20125:21;;20148:15;;;20125:21;;;;;19929:243::o;18369:255::-;-1:-1:-1;;;;;18523:29:0;;;18450:12;18523:29;;;;;;;;;;;:35;;;;;;;18577:21;;;;;;18600:15;;;;;;;18369:255::o;21288:161::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;21380:10;21369:22;;;;:10;:22;;;;;;;;:28;;;;;;;;;21362:35;;-1:-1:-1;;21362:35:0;;;;;;;;21413:28;21392:4;;21380:10;21413:28;;;21288:161;:::o;21457:239::-;-1:-1:-1;;;;;21599:25:0;;;;21534:12;21599:25;;;:10;:25;;;;;;;;:31;;;;;;;21649:21;;;21672:15;;;;21649:21;;;;;21457:239::o;23001:243::-;-1:-1:-1;;;;;23146:26:0;;;;23079:12;23146:26;;;:11;:26;;;;;;;;:32;;;;;;;23197:21;;;;;;;23220:15;;;;;23001:243::o;22563:258::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;22680:88;;;;;;;;22719:4;22680:88;;;;;;;;;;;;22660:10;-1:-1:-1;22648:23:0;;;:11;:23;;;;;:29;;;;;;;;;:120;;;;;;;;;;-1:-1:-1;;22648:120:0;;;-1:-1:-1;;22648:120:0;;;;;;;;;;;;;;;22784:29;;22672:4;;22660:10;22784:29;;;22563:258;;:::o;17907:273::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;18033:91;;;;;;;;18075:4;18033:91;;-1:-1:-1;;;;;18033:91:0;;;;;;;;;;18013:10;-1:-1:-1;17998:26:0;;;;;;;;;:32;;;;;;;;;:126;;;;;;-1:-1:-1;;17998:126:0;;;;;;;-1:-1:-1;;17998:126:0;;;;;;;;;;;;;;;;;18140:32;;17998;;18140;;;17907:273;;:::o;39866:::-;39937:29;39935:31;;;;;;;;;;:36;39931:201;;;40104:16;40115:4;40104:10;:16::i;19491:258::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;19608:88;;;;;;;;19647:4;19608:88;;;;;;;;;;19588:10;-1:-1:-1;19576:23:0;;;;;;;;;:29;;;;;;;;;:120;;;;-1:-1:-1;;19576:120:0;;;;;;;;;;;;;;;;;19712:29;;19576;;19588:10;19712:29;;;19491:258;;:::o;19757:164::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;19851:10;19839:23;;;;:11;:23;;;;;;;;:29;;;;;;;;;19832:36;;-1:-1:-1;;19832:36:0;;;;;;;;;19884:29;19863:4;;19851:10;19884:29;;;19757:164;:::o;24589:251::-;-1:-1:-1;;;;;24740:28:0;;24669:12;24740:28;;;:13;:28;;;;;;;;:34;;;;;;;;24793:21;;;24816:15;;;24785:47;;;;;;;;;;24793:21;24785:47;-1:-1:-1;;24785:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;24683:12;;24740:34;;24793:21;;;;;24816:15;;;;24785:47;;24816:15;24785:47;;;;;;;;;;;;;;;;;;;;;;;;40423:447;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;40591:213;;;;;;;;40637:4;40591:213;;;40664:124;;;;;;;;;;40591:213;40664:124;;;;;;40591:213;;;;;;40571:10;-1:-1:-1;40552:30:0;;;:18;:30;;;;;:36;;;;;;;;;:252;;;;-1:-1:-1;;40552:252:0;;;;;;;;;;;;;40591:213;;40552:36;;:252;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40552:252:0;;;;;;;;;;;-1:-1:-1;;40820:42:0;;40857:4;;40845:10;;40820:42;;40552:252;;40820:42;40423:447;;;:::o;24411:170::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;24509:10;24495:25;;;;:13;:25;;;;;;;;:31;;;;;;;;24488:38;;-1:-1:-1;;24488:38:0;;;24495:31;24488:38;;;;24495:25;24488:38;:::i;:::-;-1:-1:-1;;24542:31:0;;24568:4;;24556:10;;24542:31;;;;;24411:170;:::o;1544:160::-;470:66;1665:21;1650:47::o;41921:257::-;;;;;;;;;-1:-1:-1;41921:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41921:257:0;;;-1:-1:-1;41921:257:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://41a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a

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
Loading...
Loading
Loading...
Loading

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.