abstract contract SafeOwnable is Ownable, SafeOwnableInternal {
  using OwnableStorage for OwnableStorage.Layout;
  using SafeOwnableStorage for SafeOwnableStorage.Layout;

  function nomineeOwner () virtual public view returns (address) {
    return SafeOwnableStorage.layout().nomineeOwner;
  }

  /**
   * @inheritdoc Ownable
   * @dev ownership transfer must be accepted by beneficiary before transfer is complete
   */
  function transferOwnership (
    address account
  ) virtual override public onlyOwner {
    SafeOwnableStorage.layout().setNomineeOwner(account);
  }

  /**
   * @notice accept transfer of contract ownership
   */
  function acceptOwnership () virtual public onlyNomineeOwner {
    OwnableStorage.Layout storage l = OwnableStorage.layout();
    emit OwnershipTransferred(l.owner, msg.sender);
    l.setOwner(msg.sender);
    SafeOwnableStorage.layout().setNomineeOwner(address(0));
  }
}
/**
 * @title Ownership access control based on ERC173 with ownership transfer safety check
 */
function transferOwnership (
  address account
) virtual override public onlyOwner {
  SafeOwnableStorage.layout().setNomineeOwner(account);
}

/**
 * @inheritdoc Ownable
 * @dev ownership transfer must be accepted by beneficiary before transfer is complete
 */