contract EternalStorage is Ownable {

    struct Storage {
        mapping(uint256 => uint256) _uint;
        mapping(uint256 => address) _address;
        mapping(address => uint256) _allowed;
    }

    Storage internal s;

    constructor(uint _rF,
        address _r,
        address _f,
        address _a,
        address _t,
        uint _sF)

    public {
        setAddress(0, _a);
        setAddress(1, _r);
        setUint(1, _rF);
        setAddress(2, _f);
        setUint(2, _sF);
        setAddress(3, _t);
    }

    modifier onlyAllowed() {
        require(msg.sender == owner || s._allowed[msg.sender] == uint256(1));
        _;
    }

    function identify(address _address) external onlyOwner {
        s._allowed[_address] = uint256(1);
    }

    function revoke(address _address) external onlyOwner {
        s._allowed[_address] = uint256(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 {
        Ownable.transferOwnership(newOwner);
    }

    /**
     * @dev Allows the owner to set a value for an unsigned integer variable.
     * @param i Unsigned integer variable key
     * @param v The value to be stored
     */
    function setUint(uint256 i, uint256 v) public onlyOwner {
        s._uint[i] = v;
    }

    /**
     * @dev Allows the owner to set a value for a address variable.
     * @param i Unsigned integer variable key
     * @param v The value to be stored
     */
    function setAddress(uint256 i, address v) public onlyOwner {
        s._address[i] = v;
    }

    /**
     * @dev Get the value stored of a uint variable by the hash name
     * @param i Unsigned integer variable key
     */
    function getUint(uint256 i) external view onlyAllowed returns (uint256) {
        return s._uint[i];
    }

    /**
     * @dev Get the value stored of a address variable by the hash name
     * @param i Unsigned integer variable key
     */
    function getAddress(uint256 i) external view onlyAllowed returns (address) {
        return s._address[i];
    }

    function getAllowedStatus(address a) external view onlyAllowed returns (uint) {
        return s._allowed[a];
    }

    function selfDestruct () external onlyOwner {
        selfdestruct(owner);
    }
}
function setUint(uint256 i, uint256 v) public onlyOwner {
    s._uint[i] = v;
}

/**
 * @dev Allows the owner to set a value for an unsigned integer variable.
 * @param i Unsigned integer variable key
 * @param v The value to be stored
 */