// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/internal/transport.h>
#include <lib/fidl/cpp/wire/unknown_interactions.h>

namespace test_unknowninteractions {

class UnknownInteractionsProtocol final {
  UnknownInteractionsProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kOpen;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleOneWay final {
    FlexibleOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleTwoWay final {
    FlexibleTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayFields final {
    FlexibleTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayUnion final {
    FlexibleTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayTable final {
    FlexibleTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayErr final {
    FlexibleTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayFieldsErr final {
    FlexibleTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayUnionErr final {
    FlexibleTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayTableErr final {
    FlexibleTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class StrictEvent final {
    StrictEvent() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventFields final {
    StrictEventFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventUnion final {
    StrictEventUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventTable final {
    StrictEventTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEvent final {
    FlexibleEvent() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventFields final {
    FlexibleEventFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventUnion final {
    FlexibleEventUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventTable final {
    FlexibleEventTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
};

class UnknownInteractionsAjarProtocol final {
  UnknownInteractionsAjarProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kAjar;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleOneWay final {
    FlexibleOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEvent final {
    StrictEvent() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventFields final {
    StrictEventFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventUnion final {
    StrictEventUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventTable final {
    StrictEventTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEvent final {
    FlexibleEvent() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventFields final {
    FlexibleEventFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventUnion final {
    FlexibleEventUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleEventTable final {
    FlexibleEventTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
};

class UnknownInteractionsClosedProtocol final {
  UnknownInteractionsClosedProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kClosed;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEvent final {
    StrictEvent() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventFields final {
    StrictEventFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventUnion final {
    StrictEventUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictEventTable final {
    StrictEventTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
};

class UnknownInteractionsDriverProtocol final {
  UnknownInteractionsDriverProtocol() = delete;

 public:
  using Transport = ::fidl::internal::DriverTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kOpen;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleOneWay final {
    FlexibleOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleTwoWay final {
    FlexibleTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayFields final {
    FlexibleTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayUnion final {
    FlexibleTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayTable final {
    FlexibleTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayErr final {
    FlexibleTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayFieldsErr final {
    FlexibleTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayUnionErr final {
    FlexibleTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
  class FlexibleTwoWayTableErr final {
    FlexibleTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = true;
  };
};

class UnknownInteractionsAjarDriverProtocol final {
  UnknownInteractionsAjarDriverProtocol() = delete;

 public:
  using Transport = ::fidl::internal::DriverTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kAjar;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleOneWay final {
    FlexibleOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
};

class UnknownInteractionsClosedDriverProtocol final {
  UnknownInteractionsClosedDriverProtocol() = delete;

 public:
  using Transport = ::fidl::internal::DriverTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kClosed;

  class StrictOneWay final {
    StrictOneWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWay final {
    StrictTwoWay() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFields final {
    StrictTwoWayFields() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnion final {
    StrictTwoWayUnion() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTable final {
    StrictTwoWayTable() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayErr final {
    StrictTwoWayErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayFieldsErr final {
    StrictTwoWayFieldsErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayUnionErr final {
    StrictTwoWayUnionErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class StrictTwoWayTableErr final {
    StrictTwoWayTableErr() = delete;

   public:
    using Protocol = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
};

}  // namespace test_unknowninteractions
namespace fidl {

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsProtocol> : public std::true_type {};

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsAjarProtocol> : public std::true_type {};

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsClosedProtocol> : public std::true_type {};

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsDriverProtocol> : public std::true_type {};

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocol> : public std::true_type {};

template <>
struct IsProtocol<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocol> : public std::true_type {};

}  // namespace fidl
