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

#pragma once

#include <fidl/test.protocollayouts/cpp/markers.h>
#include <fidl/test.protocollayouts/cpp/wire_types.h>
#include <lib/fidl/llcpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>

#endif  // __Fuchsia__

#include <fidl/test.protocollayouts.imported/cpp/wire_messaging.h>

namespace test_protocollayouts {
class MainProtocol;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolOneWayAnonComposedRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolOnAnonComposedRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolOnAnonComposedWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ImportTablePayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ImportUnionPayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolTwoWayNamedComposedWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_imported_ComposedProtocolOnNamedComposedWithErrorRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayImportWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolOnImportWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_LocalTablePayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_LocalUnionPayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayLocalWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolOnLocalWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolOneWayAnonRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayAnonRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayAnonResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayAnonWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolTwoWayAnonWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolOnAnonRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocollayouts_MainProtocolOnAnonWithErrorRequestTable;
}  // namespace test_protocollayouts
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
    final {
  static constexpr uint64_t value = 467706262354916833lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final {
  static constexpr uint64_t value = 1634702755099390832lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final {
  static constexpr uint64_t value = 3374101322700362141lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnAnonComposed>
    final {
  static constexpr uint64_t value = 9198778981238868491lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>
    final {
  static constexpr uint64_t value = 712214127111113275lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
    final {
  static constexpr uint64_t value = 6735359826241449560lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final {
  static constexpr uint64_t value = 1110122450485917712lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final {
  static constexpr uint64_t value = 3520341666774118271lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnNamedComposed>
    final {
  static constexpr uint64_t value = 6802961197456477674lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>
    final {
  static constexpr uint64_t value = 7488207288618998795lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OneWayImport>
    final {
  static constexpr uint64_t value = 374039999976906043lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    final {
  static constexpr uint64_t value = 3167860988423964164lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final {
  static constexpr uint64_t value = 4837028007581646602lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnImport>
    final {
  static constexpr uint64_t value = 6584793811321990352lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnImportWithError>
    final {
  static constexpr uint64_t value = 1123803631971094487lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OneWayLocal>
    final {
  static constexpr uint64_t value = 6085941264859402051lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    final {
  static constexpr uint64_t value = 7763901300032164763lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final {
  static constexpr uint64_t value = 5609487496960056151lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnLocal>
    final {
  static constexpr uint64_t value = 4199259762307646332lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnLocalWithError>
    final {
  static constexpr uint64_t value = 8767483445230259748lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OneWayAnon>
    final {
  static constexpr uint64_t value = 4203317713771984620lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    final {
  static constexpr uint64_t value = 7435080039097281487lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final {
  static constexpr uint64_t value = 7770394869745610225lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnAnon>
    final {
  static constexpr uint64_t value = 7275479350674227467lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocollayouts::MainProtocol::OnAnonWithError>
    final {
  static constexpr uint64_t value = 3672186790919812761lu;
};

namespace test_protocollayouts {}  // namespace test_protocollayouts
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_protocollayouts::MainProtocol> {
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_protocollayouts::MainProtocol>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_protocollayouts::MainProtocol>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_protocollayouts::MainProtocol>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolOneWayAnonComposedRequest {
  explicit WireRequest(::test_protocollayouts_imported::wire::
                           ComposedProtocolOneWayAnonComposedRequest
                               ComposedProtocolOneWayAnonComposedRequest)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOneWayAnonComposedRequest(
                ComposedProtocolOneWayAnonComposedRequest) {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnonComposed>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOneWayAnonComposedRequest
              ComposedProtocolOneWayAnonComposedRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::OneWayAnonComposed>(
            ComposedProtocolOneWayAnonComposedRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolTwoWayAnonComposedRequest {
  explicit WireRequest(::test_protocollayouts_imported::wire::
                           ComposedProtocolTwoWayAnonComposedRequest
                               ComposedProtocolTwoWayAnonComposedRequest)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayAnonComposedRequest(
                ComposedProtocolTwoWayAnonComposedRequest) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedRequest
              ComposedProtocolTwoWayAnonComposedRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(
            ComposedProtocolTwoWayAnonComposedRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolTwoWayAnonComposedResponse {
  explicit WireResponse(::test_protocollayouts_imported::wire::
                            ComposedProtocolTwoWayAnonComposedResponse
                                ComposedProtocolTwoWayAnonComposedResponse)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayAnonComposedResponse(
                ComposedProtocolTwoWayAnonComposedResponse) {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedResponse
              ComposedProtocolTwoWayAnonComposedResponse)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(
            ComposedProtocolTwoWayAnonComposedResponse)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolTwoWayAnonComposedWithErrorRequest {
  explicit WireRequest(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayAnonComposedWithErrorRequest(
                ComposedProtocolTwoWayAnonComposedWithErrorRequest) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(
            ComposedProtocolTwoWayAnonComposedWithErrorRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolTwoWayAnonComposedWithErrorTopResponse {
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorTopResponse base)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayAnonComposedWithErrorTopResponse(
                std::move(base)) {}
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorResult result)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayAnonComposedWithErrorTopResponse{
                .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorResult result)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolOnAnonComposedRequest {
  explicit WireEvent(::test_protocollayouts_imported::wire::
                         ComposedProtocolOnAnonComposedRequest
                             ComposedProtocolOnAnonComposedRequest)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOnAnonComposedRequest(
                ComposedProtocolOnAnonComposedRequest) {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed> body;
  explicit TransactionalEvent(::test_protocollayouts_imported::wire::
                                  ComposedProtocolOnAnonComposedRequest
                                      ComposedProtocolOnAnonComposedRequest)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnAnonComposed>(
            ComposedProtocolOnAnonComposedRequest)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolOnAnonComposedWithErrorRequest {
  explicit WireEvent(::test_protocollayouts_imported::wire::
                         ComposedProtocolOnAnonComposedWithErrorRequest base)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOnAnonComposedWithErrorRequest(std::move(base)) {}
  explicit WireEvent(::test_protocollayouts_imported::wire::
                         ComposedProtocolOnAnonComposedWithErrorResult result)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOnAnonComposedWithErrorRequest{
                .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<
      ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnAnonComposedWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportTablePayload
                           ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayNamedComposed>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::OneWayNamedComposed>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final : public ::test_protocollayouts_imported::wire::ImportUnionPayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportUnionPayload
                           ImportUnionPayload)
      : ::test_protocollayouts_imported::wire::ImportUnionPayload(
            ImportUnionPayload) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(
            ImportUnionPayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportTablePayload
                           ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                     TwoWayNamedComposedWithError>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolTwoWayNamedComposedWithErrorTopResponse {
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayNamedComposedWithErrorTopResponse base)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayNamedComposedWithErrorTopResponse(
                std::move(base)) {}
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayNamedComposedWithErrorResult result)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolTwoWayNamedComposedWithErrorTopResponse{
                .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayNamedComposedWithErrorResult result)
      : body(::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                      TwoWayNamedComposedWithError>(result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>
    final : public ::test_protocollayouts_imported::wire::ImportUnionPayload {
  explicit WireEvent(::test_protocollayouts_imported::wire::ImportUnionPayload
                         ImportUnionPayload)
      : ::test_protocollayouts_imported::wire::ImportUnionPayload(
            ImportUnionPayload) {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed> body;
  explicit TransactionalEvent(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnNamedComposed>(
            ImportUnionPayload)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>
    final : public ::test_protocollayouts_imported::wire::
                ComposedProtocolOnNamedComposedWithErrorRequest {
  explicit WireEvent(::test_protocollayouts_imported::wire::
                         ComposedProtocolOnNamedComposedWithErrorRequest base)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOnNamedComposedWithErrorRequest(std::move(base)) {}
  explicit WireEvent(::test_protocollayouts_imported::wire::
                         ComposedProtocolOnNamedComposedWithErrorResult result)
      : ::test_protocollayouts_imported::wire::
            ComposedProtocolOnNamedComposedWithErrorRequest{
                .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<
      ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnNamedComposedWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayImport>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportTablePayload
                           ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayImport> body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::OneWayImport>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayImport>
    final : public ::test_protocollayouts_imported::wire::ImportUnionPayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportUnionPayload
                           ImportUnionPayload)
      : ::test_protocollayouts_imported::wire::ImportUnionPayload(
            ImportUnionPayload) {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayImport> body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayImport>(
            ImportUnionPayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireResponse(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport> body;
  explicit TransactionalResponse(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayImport>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final : public ::test_protocollayouts_imported::wire::ImportTablePayload {
  explicit WireRequest(::test_protocollayouts_imported::wire::ImportTablePayload
                           ImportTablePayload)
      : ::test_protocollayouts_imported::wire::ImportTablePayload(
            ImportTablePayload) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayImportWithError>(
            ImportTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final : public ::test_protocollayouts::wire::
                MainProtocolTwoWayImportWithErrorTopResponse {
  using Result =
      test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult;

  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorTopResponse
          base)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayImportWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult
          result)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayImportWithErrorTopResponse{
                .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayImportWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport> final
    : public ::test_protocollayouts_imported::wire::ImportUnionPayload {
  explicit WireEvent(::test_protocollayouts_imported::wire::ImportUnionPayload
                         ImportUnionPayload)
      : ::test_protocollayouts_imported::wire::ImportUnionPayload(
            ImportUnionPayload) {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport> body;
  explicit TransactionalEvent(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload)
      : body(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>(
            ImportUnionPayload)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>
    final : public ::test_protocollayouts::wire::
                MainProtocolOnImportWithErrorRequest {
  using Result =
      test_protocollayouts::wire::MainProtocolOnImportWithErrorResult;

  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorRequest base)
      : ::test_protocollayouts::wire::MainProtocolOnImportWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result)
      : ::test_protocollayouts::wire::MainProtocolOnImportWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImportWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnImportWithError>(result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayLocal>
    final : public ::test_protocollayouts::wire::LocalTablePayload {
  explicit WireRequest(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : ::test_protocollayouts::wire::LocalTablePayload(LocalTablePayload) {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayLocal> body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::OneWayLocal>(
            LocalTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>
    final : public ::test_protocollayouts::wire::LocalUnionPayload {
  explicit WireRequest(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
      : ::test_protocollayouts::wire::LocalUnionPayload(LocalUnionPayload) {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayLocal> body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayLocal>(
            LocalUnionPayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>
    final : public ::test_protocollayouts::wire::LocalTablePayload {
  explicit WireResponse(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : ::test_protocollayouts::wire::LocalTablePayload(LocalTablePayload) {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> body;
  explicit TransactionalResponse(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayLocal>(
            LocalTablePayload)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final : public ::test_protocollayouts::wire::LocalTablePayload {
  explicit WireRequest(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : ::test_protocollayouts::wire::LocalTablePayload(LocalTablePayload) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(
            LocalTablePayload)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final : public ::test_protocollayouts::wire::
                MainProtocolTwoWayLocalWithErrorTopResponse {
  using Result =
      test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult;

  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorTopResponse
          base)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayLocalWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult
          result)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayLocalWithErrorTopResponse{.result =
                                                            std::move(result)} {
  }
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal> final
    : public ::test_protocollayouts::wire::LocalUnionPayload {
  explicit WireEvent(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
      : ::test_protocollayouts::wire::LocalUnionPayload(LocalUnionPayload) {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal> body;
  explicit TransactionalEvent(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload)
      : body(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>(
            LocalUnionPayload)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>
    final
    : public ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorRequest {
  using Result = test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult;

  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorRequest base)
      : ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result)
      : ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnLocalWithError>(result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnon>
    final : public ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest {
  explicit WireRequest(
      ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
          MainProtocolOneWayAnonRequest)
      : ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest(
            MainProtocolOneWayAnonRequest) {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnon> body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
          MainProtocolOneWayAnonRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::OneWayAnon>(
            MainProtocolOneWayAnonRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>
    final : public ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest {
  explicit WireRequest(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
          MainProtocolTwoWayAnonRequest)
      : ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest(
            MainProtocolTwoWayAnonRequest) {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnon> body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
          MainProtocolTwoWayAnonRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayAnon>(
            MainProtocolTwoWayAnonRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>
    final
    : public ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse {
  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse
          MainProtocolTwoWayAnonResponse)
      : ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse(
            MainProtocolTwoWayAnonResponse) {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> body;
  explicit TransactionalResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse
          MainProtocolTwoWayAnonResponse)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayAnon>(
            MainProtocolTwoWayAnonResponse)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final : public ::test_protocollayouts::wire::
                MainProtocolTwoWayAnonWithErrorRequest {
  explicit WireRequest(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest)
      : ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest(
            MainProtocolTwoWayAnonWithErrorRequest) {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
      body;
  explicit TransactionalRequest(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest)
      : body(::fidl::WireRequest<
             ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(
            MainProtocolTwoWayAnonWithErrorRequest)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final : public ::test_protocollayouts::wire::
                MainProtocolTwoWayAnonWithErrorTopResponse {
  using Result =
      test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult;

  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorTopResponse
          base)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayAnonWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult
          result)
      : ::test_protocollayouts::wire::
            MainProtocolTwoWayAnonWithErrorTopResponse{.result =
                                                           std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon> final
    : public ::test_protocollayouts::wire::MainProtocolOnAnonRequest {
  explicit WireEvent(::test_protocollayouts::wire::MainProtocolOnAnonRequest
                         MainProtocolOnAnonRequest)
      : ::test_protocollayouts::wire::MainProtocolOnAnonRequest(
            MainProtocolOnAnonRequest) {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon> body;
  explicit TransactionalEvent(
      ::test_protocollayouts::wire::MainProtocolOnAnonRequest
          MainProtocolOnAnonRequest)
      : body(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>(
            MainProtocolOnAnonRequest)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>
    final
    : public ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorRequest {
  using Result = test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult;

  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorRequest base)
      : ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result)
      : ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError> body;
  explicit TransactionalEvent(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocollayouts::MainProtocol::OnAnonWithError>(result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::
                  TwoWayAnonComposedWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::
                  TwoWayAnonComposedWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::
                  TwoWayNamedComposedWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::
                  TwoWayNamedComposedWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayImport> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayImport>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImport,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayImport>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImport,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayImport>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayLocal> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocal,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayLocal>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocal,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayLocal>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayAnon> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnon,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnon>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnon,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnon>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOneWayAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::OneWayAnonComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnonComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::OneWayAnonComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::OneWayAnonComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOneWayAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::OneWayAnonComposed>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       OneWayAnonComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       TwoWayAnonComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>) ==
    TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                        TwoWayAnonComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::
               TwoWayAnonComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                   TwoWayAnonComposedWithError>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::
        kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::
               TwoWayAnonComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayAnonComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                    TwoWayAnonComposedWithError>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>,
        result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnAnonComposed>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnAnonComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnAnonComposedRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnAnonComposed>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnAnonComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnAnonComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnAnonComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::
                                     OnAnonComposedWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::OneWayNamedComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayNamedComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::OneWayNamedComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::OneWayNamedComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::OneWayNamedComposed>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       OneWayNamedComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       TwoWayNamedComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>) ==
    TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                        TwoWayNamedComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::
               TwoWayNamedComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                   TwoWayNamedComposedWithError>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::
        kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayNamedComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::
               TwoWayNamedComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolTwoWayNamedComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                    TwoWayNamedComposedWithError>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>,
        result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnNamedComposed>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnNamedComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnNamedComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnNamedComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnNamedComposed>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnNamedComposed>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnNamedComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalEvent<
            ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalEvent<
            ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ComposedProtocolOnNamedComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::
                                     OnNamedComposedWithError>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireEvent<
            ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>,
        result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::OneWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::OneWayImport>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::OneWayImport>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       TwoWayImportWithError>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayImportWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayImportWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                        TwoWayImportWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImport>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImport>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnImport>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_imported_ImportUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnImport>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnImportWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocollayouts::MainProtocol::OnImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnImportWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnImportWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocollayouts::MainProtocol::
                                     OnImportWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocollayouts::MainProtocol::OnImportWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::OneWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::OneWayLocal>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::OneWayLocal>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalTablePayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       TwoWayLocalWithError>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayLocalWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayLocalWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                        TwoWayLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocal>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnLocal>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::test_protocollayouts_LocalUnionPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnLocal>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnLocalWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnLocalWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnLocalWithError>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocollayouts::MainProtocol::OnLocalWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnon>> : public std::true_type {
};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnon>> : public std::true_type {
};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::OneWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOneWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::OneWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::OneWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::OneWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOneWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::OneWayAnon>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnon>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {
};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {
};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocollayouts::MainProtocol::TwoWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {
};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> : public std::true_type {
};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocollayouts::MainProtocol::TwoWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 24;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocollayouts::MainProtocol::
                                       TwoWayAnonWithError>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolTwoWayAnonWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::
                                        TwoWayAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnon>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<
                     ::test_protocollayouts::MainProtocol::OnAnon>) ==
              TypeTraits<::fidl::internal::TransactionalEvent<
                  ::test_protocollayouts::MainProtocol::OnAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocollayouts::MainProtocol::OnAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnAnon>>::kPrimarySize);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocollayouts::MainProtocol::OnAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocollayouts::MainProtocol::OnAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocollayouts::MainProtocol::OnAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocollayouts::
          test_protocollayouts_MainProtocolOnAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 24;
  static constexpr uint32_t kMaxOutOfLineV1 = 40;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocollayouts::MainProtocol::OnAnonWithError>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocollayouts::MainProtocol::OnAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocollayouts::MainProtocol::OnAnonWithError>,
             result) == 0);

}  // namespace fidl
namespace test_protocollayouts {
#ifdef __Fuchsia__
}  // namespace test_protocollayouts
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayAnonComposed>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayAnonComposed>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::
                     ComposedProtocolTwoWayAnonComposedWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::
                     ComposedProtocolTwoWayAnonComposedWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<72> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::
                     TwoWayAnonComposedWithError>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::
                     TwoWayAnonComposedWithError>*>(bytes_)
                 ->body);
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::
                     ComposedProtocolTwoWayAnonComposedWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::
                     ComposedProtocolTwoWayAnonComposedWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::
                    ComposedProtocolTwoWayAnonComposedWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayNamedComposed>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayNamedComposed>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<72> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::
                     TwoWayNamedComposedWithError>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::
                     TwoWayNamedComposedWithError>*>(bytes_)
                 ->body);
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::OneWayImport>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayImport>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::OneWayImport>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayImport>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImport>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImport>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImport>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayImport>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayImport>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImport>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<72> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts_imported::wire::ImportUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::OneWayLocal>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayLocal>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::OneWayLocal>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayLocal>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocal>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocal>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocal>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayLocal>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayLocal>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocollayouts::wire::LocalUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocollayouts::wire::LocalUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocollayouts::wire::LocalUnionPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocollayouts::wire::LocalUnionPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocollayouts::wire::LocalUnionPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::OneWayAnon>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayAnon>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::OneWayAnon>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::OneWayAnon>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnon>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnon>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnon>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnon>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnon>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocollayouts::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*>(bytes_)
            ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_protocollayouts::MainProtocol> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
  virtual void OnAnonComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>*
          event) = 0;
  virtual void OnAnonComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>*
          event) = 0;
  virtual void OnNamedComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>*
          event) = 0;
  virtual void OnNamedComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>*
          event) = 0;
  virtual void OnImport(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>*
          event) = 0;
  virtual void OnImportWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnImportWithError>* event) = 0;
  virtual void OnLocal(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>*
          event) = 0;
  virtual void OnLocalWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>*
          event) = 0;
  virtual void OnAnon(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>*
          event) = 0;
  virtual void OnAnonWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>*
          event) = 0;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_protocollayouts::MainProtocol>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
  void OnAnonComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>*
          event) override {}
  void OnAnonComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>* event)
      override {}
  void OnNamedComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>*
          event) override {}
  void OnNamedComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>*
          event) override {}
  void OnImport(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>* event)
      override {}
  void OnImportWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnImportWithError>* event)
      override {}
  void OnLocal(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>*
                   event) override {}
  void OnLocalWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>*
          event) override {}
  void OnAnon(::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>*
                  event) override {}
  void OnAnonWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>*
          event) override {}
};

template <>
class ::fidl::WireSyncEventHandler<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_protocollayouts::MainProtocol> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_protocollayouts::MainProtocol>
    final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::WireAsyncEventHandler<::test_protocollayouts::MainProtocol>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_protocollayouts::MainProtocol>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |fidl::ClientEnd<::test_protocollayouts::MainProtocol>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_protocollayouts::MainProtocol>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_protocollayouts::MainProtocol>> {
 public:
  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnonComposed>
  OneWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolOneWayAnonComposedRequest
                             ComposedProtocolOneWayAnonComposedRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
        _request{ComposedProtocolOneWayAnonComposedRequest};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::OneWayAnonComposed>(_client_end(),
                                                                  &_request);
  }

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
  TwoWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolTwoWayAnonComposedRequest
                             ComposedProtocolTwoWayAnonComposedRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
        _request{ComposedProtocolTwoWayAnonComposedRequest};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(_client_end(),
                                                                  &_request);
  }

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
  TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
        _request{ComposedProtocolTwoWayAnonComposedWithErrorRequest};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(
        _client_end(), &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayNamedComposed>
  OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload
                          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
        _request{ImportTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::OneWayNamedComposed>(
        _client_end(), &_request);
  }

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
  TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload
                          ImportUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
        _request{ImportUnionPayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(
        _client_end(), &_request);
  }

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
  TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
        _request{ImportTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(
        _client_end(), &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayImport>
  OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload
                   ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayImport>
        _request{ImportTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::OneWayImport>(_client_end(),
                                                            &_request);
  }

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport>
  TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload
                   ImportUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImport>
        _request{ImportUnionPayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayImport>(_client_end(),
                                                            &_request);
  }

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
        _request{ImportTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>(
        _client_end(), &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayLocal>
  OneWayLocal(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayLocal>
        _request{LocalTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::OneWayLocal>(_client_end(),
                                                           &_request);
  }

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>
  TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>
        _request{LocalUnionPayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>(_client_end(),
                                                           &_request);
  }

  // Allocates 40 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
        _request{LocalTablePayload};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(
        _client_end(), &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnon>
  OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
                 MainProtocolOneWayAnonRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnon>
        _request{MainProtocolOneWayAnonRequest};
    return ::fidl::WireResult<::test_protocollayouts::MainProtocol::OneWayAnon>(
        _client_end(), &_request);
  }

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>
  TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
                 MainProtocolTwoWayAnonRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>
        _request{MainProtocolTwoWayAnonRequest};
    return ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>(
        _client_end(), &_request);
  }

  // Allocates 40 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
        _request{MainProtocolTwoWayAnonWithErrorRequest};
    return ::fidl::WireResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(
        _client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_protocollayouts::MainProtocol>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_protocollayouts::MainProtocol>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
  OneWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolOneWayAnonComposedRequest
                             ComposedProtocolOneWayAnonComposedRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnonComposed>
        _request{ComposedProtocolOneWayAnonComposedRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::OneWayAnonComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
  TwoWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolTwoWayAnonComposedRequest
                             ComposedProtocolTwoWayAnonComposedRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
        _request{ComposedProtocolTwoWayAnonComposedRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
  TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
        _request{ComposedProtocolTwoWayAnonComposedWithErrorRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
  OneWayNamedComposed(::test_protocollayouts_imported::wire::ImportTablePayload
                          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayNamedComposed>
        _request{ImportTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::OneWayNamedComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
  TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload
                          ImportUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
        _request{ImportUnionPayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
  TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
        _request{ImportTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayImport>
  OneWayImport(::test_protocollayouts_imported::wire::ImportTablePayload
                   ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayImport>
        _request{ImportTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::OneWayImport>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayImport>
  TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload
                   ImportUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImport>
        _request{ImportUnionPayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayImport>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
        _request{ImportTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayImportWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayLocal>
  OneWayLocal(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayLocal>
        _request{LocalTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::OneWayLocal>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayLocal>
  TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>
        _request{LocalUnionPayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayLocal>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
        _request{LocalTablePayload};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::OneWayAnon>
  OneWayAnon(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
                 MainProtocolOneWayAnonRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::OneWayAnon>
        _request{MainProtocolOneWayAnonRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::OneWayAnon>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocollayouts::MainProtocol::TwoWayAnon>
  TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
                 MainProtocolTwoWayAnonRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>
        _request{MainProtocolTwoWayAnonRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnon>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
        _request{MainProtocolTwoWayAnonWithErrorRequest};
    return ::fidl::WireUnownedResult<
        ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>(
        _client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_protocollayouts::MainProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayAnonComposedResponse
                     ComposedProtocolTwoWayAnonComposedResponse);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayAnonComposedResponse
                     ComposedProtocolTwoWayAnonComposedResponse);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposed> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayAnonComposedWithErrorResult result);
  void ReplySuccess(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorResponse
              ComposedProtocolTwoWayAnonComposedWithErrorResponse);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayAnonComposedWithErrorResult result);
  void ReplySuccess(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorResponse
              ComposedProtocolTwoWayAnonComposedWithErrorResponse);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload
                 ImportTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload
                 ImportTablePayload);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayNamedComposedWithErrorResult result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload
                        ImportUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::
                 ComposedProtocolTwoWayNamedComposedWithErrorResult result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload
                        ImportUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload
                 ImportTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts_imported::wire::ImportTablePayload
                 ImportTablePayload);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayImport>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayImport> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult
          result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload
                        ImportUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult
          result);
  void ReplySuccess(::test_protocollayouts_imported::wire::ImportUnionPayload
                        ImportUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayLocal>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayLocal> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult
          result);
  void ReplySuccess(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult
          result);
  void ReplySuccess(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse
                 MainProtocolTwoWayAnonResponse);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse
                 MainProtocolTwoWayAnonResponse);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayAnon>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayAnon> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult
                 result);
  void ReplySuccess(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse
          MainProtocolTwoWayAnonWithErrorResponse);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult
                 result);
  void ReplySuccess(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse
          MainProtocolTwoWayAnonWithErrorResponse);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocollayouts::MainProtocol::TwoWayAnonWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_protocollayouts::MainProtocol;

  using OneWayAnonComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::OneWayAnonComposed>;
  using OneWayAnonComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::OneWayAnonComposed>;

  virtual void OneWayAnonComposed(
      OneWayAnonComposedRequestView request,
      OneWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
  using TwoWayAnonComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;

  virtual void TwoWayAnonComposed(
      TwoWayAnonComposedRequestView request,
      TwoWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;
  using TwoWayAnonComposedWithErrorRequestView =
      ::fidl::internal::WireRequestView<
          ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;

  virtual void TwoWayAnonComposedWithError(
      TwoWayAnonComposedWithErrorRequestView request,
      TwoWayAnonComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayNamedComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::OneWayNamedComposed>;
  using OneWayNamedComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::OneWayNamedComposed>;

  virtual void OneWayNamedComposed(
      OneWayNamedComposedRequestView request,
      OneWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
  using TwoWayNamedComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;

  virtual void TwoWayNamedComposed(
      TwoWayNamedComposedRequestView request,
      TwoWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;
  using TwoWayNamedComposedWithErrorRequestView =
      ::fidl::internal::WireRequestView<
          ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;

  virtual void TwoWayNamedComposedWithError(
      TwoWayNamedComposedWithErrorRequestView request,
      TwoWayNamedComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayImportCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::OneWayImport>;
  using OneWayImportRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::OneWayImport>;

  virtual void OneWayImport(OneWayImportRequestView request,
                            OneWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayImport>;
  using TwoWayImportRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayImport>;

  virtual void TwoWayImport(TwoWayImportRequestView request,
                            TwoWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
  using TwoWayImportWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>;

  virtual void TwoWayImportWithError(
      TwoWayImportWithErrorRequestView request,
      TwoWayImportWithErrorCompleter::Sync& completer) = 0;

  using OneWayLocalCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::OneWayLocal>;
  using OneWayLocalRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::OneWayLocal>;

  virtual void OneWayLocal(OneWayLocalRequestView request,
                           OneWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>;
  using TwoWayLocalRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>;

  virtual void TwoWayLocal(TwoWayLocalRequestView request,
                           TwoWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;
  using TwoWayLocalWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;

  virtual void TwoWayLocalWithError(
      TwoWayLocalWithErrorRequestView request,
      TwoWayLocalWithErrorCompleter::Sync& completer) = 0;

  using OneWayAnonCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::OneWayAnon>;
  using OneWayAnonRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::OneWayAnon>;

  virtual void OneWayAnon(OneWayAnonRequestView request,
                          OneWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>;
  using TwoWayAnonRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>;

  virtual void TwoWayAnon(TwoWayAnonRequestView request,
                          TwoWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
  using TwoWayAnonWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;

  virtual void TwoWayAnonWithError(
      TwoWayAnonWithErrorRequestView request,
      TwoWayAnonWithErrorCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace test_protocollayouts {
#endif  // __Fuchsia__

}  // namespace test_protocollayouts
namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayAnonComposed(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOneWayAnonComposedRequest
              ComposedProtocolOneWayAnonComposedRequest);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayNamedComposed(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayImport(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayLocal(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayAnon(
      ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
          MainProtocolOneWayAnonRequest);
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_protocollayouts::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 32 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
  TwoWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolTwoWayAnonComposedRequest
                             ComposedProtocolTwoWayAnonComposedRequest);
  // Allocates 40 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
  TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest);
  // Allocates 32 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
  TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload
                          ImportUnionPayload);
  // Allocates 40 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
  TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);
  // Allocates 32 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayImport>
  TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload
                   ImportUnionPayload);
  // Allocates 40 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);
  // Allocates 32 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>
  TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);
  // Allocates 40 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);
  // Allocates 32 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>
  TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
                 MainProtocolTwoWayAnonRequest);
  // Allocates 40 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayAnonComposed(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOneWayAnonComposedRequest
              ComposedProtocolOneWayAnonComposedRequest);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayNamedComposed(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayImport(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayLocal(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayAnon(
      ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest
          MainProtocolOneWayAnonRequest);
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_protocollayouts::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
  TwoWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolTwoWayAnonComposedRequest
                             ComposedProtocolTwoWayAnonComposedRequest);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
  TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
  TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload
                          ImportUnionPayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
  TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayImport>
  TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload
                   ImportUnionPayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayLocal>
  TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnon>
  TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
                 MainProtocolTwoWayAnonRequest);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_protocollayouts::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_protocollayouts::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>
  TwoWayAnonComposed(::test_protocollayouts_imported::wire::
                         ComposedProtocolTwoWayAnonComposedRequest
                             ComposedProtocolTwoWayAnonComposedRequest);

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>
  TwoWayAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolTwoWayAnonComposedWithErrorRequest
              ComposedProtocolTwoWayAnonComposedWithErrorRequest);

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>
  TwoWayNamedComposed(::test_protocollayouts_imported::wire::ImportUnionPayload
                          ImportUnionPayload);

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>
  TwoWayNamedComposedWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayImport>
  TwoWayImport(::test_protocollayouts_imported::wire::ImportUnionPayload
                   ImportUnionPayload);

  // Allocates 88 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocollayouts::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(
      ::test_protocollayouts_imported::wire::ImportTablePayload
          ImportTablePayload);

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocal>
  TwoWayLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  // Allocates 40 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(
      ::test_protocollayouts::wire::LocalTablePayload LocalTablePayload);

  // Allocates 32 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnon>
  TwoWayAnon(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest
                 MainProtocolTwoWayAnonRequest);

  // Allocates 40 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(
      ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest
          MainProtocolTwoWayAnonWithErrorRequest);
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  fidl::Status OnAnonComposed(::test_protocollayouts_imported::wire::
                                  ComposedProtocolOnAnonComposedRequest
                                      ComposedProtocolOnAnonComposedRequest);

  fidl::Status OnAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnAnonComposedWithErrorResult result);

  fidl::Status OnNamedComposed(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnNamedComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnNamedComposedWithErrorResult result);

  fidl::Status OnImport(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnImportWithError(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result);

  fidl::Status OnLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  fidl::Status OnLocalWithError(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest
                          MainProtocolOnAnonRequest);

  fidl::Status OnAnonWithError(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;

  fidl::Status OnAnonComposed(::test_protocollayouts_imported::wire::
                                  ComposedProtocolOnAnonComposedRequest
                                      ComposedProtocolOnAnonComposedRequest);

  fidl::Status OnAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnAnonComposedWithErrorResult result);

  fidl::Status OnNamedComposed(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnNamedComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnNamedComposedWithErrorResult result);

  fidl::Status OnImport(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnImportWithError(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result);

  fidl::Status OnLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  fidl::Status OnLocalWithError(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest
                          MainProtocolOnAnonRequest);

  fidl::Status OnAnonWithError(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireEventSender<::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_protocollayouts::MainProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  fidl::Status OnAnonComposed(::test_protocollayouts_imported::wire::
                                  ComposedProtocolOnAnonComposedRequest
                                      ComposedProtocolOnAnonComposedRequest);

  fidl::Status OnAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnAnonComposedWithErrorResult result);

  fidl::Status OnNamedComposed(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnNamedComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnNamedComposedWithErrorResult result);

  fidl::Status OnImport(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnImportWithError(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result);

  fidl::Status OnLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  fidl::Status OnLocalWithError(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest
                          MainProtocolOnAnonRequest);

  fidl::Status OnAnonWithError(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_protocollayouts::MainProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;

  fidl::Status OnAnonComposed(::test_protocollayouts_imported::wire::
                                  ComposedProtocolOnAnonComposedRequest
                                      ComposedProtocolOnAnonComposedRequest);

  fidl::Status OnAnonComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnAnonComposedWithErrorResult result);

  fidl::Status OnNamedComposed(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnNamedComposedWithError(
      ::test_protocollayouts_imported::wire::
          ComposedProtocolOnNamedComposedWithErrorResult result);

  fidl::Status OnImport(
      ::test_protocollayouts_imported::wire::ImportUnionPayload
          ImportUnionPayload);

  fidl::Status OnImportWithError(
      ::test_protocollayouts::wire::MainProtocolOnImportWithErrorResult result);

  fidl::Status OnLocal(
      ::test_protocollayouts::wire::LocalUnionPayload LocalUnionPayload);

  fidl::Status OnLocalWithError(
      ::test_protocollayouts::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnAnon(::test_protocollayouts::wire::MainProtocolOnAnonRequest
                          MainProtocolOnAnonRequest);

  fidl::Status OnAnonWithError(
      ::test_protocollayouts::wire::MainProtocolOnAnonWithErrorResult result);
};
#endif  // __Fuchsia__
