# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#
# WARNING: This file is machine generated by fidlgen.

include <fidl/test/inheritancewithrecursivedecl/c/fidl.h>


fidl_test_inheritancewithrecursivedecl_ParentFirstRequest {
       hdr fidl_message_header[3051519745671742363]
       request flags[fidl_handle_presence, int32]
} [packed]
fidl_test_inheritancewithrecursivedecl_ParentFirstRequestHandles {
       request zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server
} [packed]

resource zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_client[zx_chan]
resource zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server[zx_chan]

zx_channel_create$fidl_test_inheritancewithrecursivedecl_Parent(options const[0], out0 ptr[out, zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_client], out1 ptr[out, zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server])
fdio_service_connect$fidl_test_inheritancewithrecursivedecl_Parent(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server)
zx_channel_write$fidl_test_inheritancewithrecursivedecl_ParentFirst(handle zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_client, options const[0], bytes ptr[in, fidl_test_inheritancewithrecursivedecl_ParentFirstRequest], num_bytes bytesize[bytes], handles ptr[in, fidl_test_inheritancewithrecursivedecl_ParentFirstRequestHandles], num_handles bytesize[handles])


fidl_test_inheritancewithrecursivedecl_ChildFirstRequest {
       hdr fidl_message_header[3051519745671742363]
       request flags[fidl_handle_presence, int32]
} [packed]
fidl_test_inheritancewithrecursivedecl_ChildFirstRequestHandles {
       request zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server
} [packed]
fidl_test_inheritancewithrecursivedecl_ChildSecondRequest {
       hdr fidl_message_header[489667253787160198]
       request flags[fidl_handle_presence, int32]
} [packed]
fidl_test_inheritancewithrecursivedecl_ChildSecondRequestHandles {
       request zx_chan_fidl_test_inheritancewithrecursivedecl_Parent_server
} [packed]

resource zx_chan_fidl_test_inheritancewithrecursivedecl_Child_client[zx_chan]
resource zx_chan_fidl_test_inheritancewithrecursivedecl_Child_server[zx_chan]

zx_channel_create$fidl_test_inheritancewithrecursivedecl_Child(options const[0], out0 ptr[out, zx_chan_fidl_test_inheritancewithrecursivedecl_Child_client], out1 ptr[out, zx_chan_fidl_test_inheritancewithrecursivedecl_Child_server])
fdio_service_connect$fidl_test_inheritancewithrecursivedecl_Child(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_inheritancewithrecursivedecl_Child_server)
zx_channel_write$fidl_test_inheritancewithrecursivedecl_ChildFirst(handle zx_chan_fidl_test_inheritancewithrecursivedecl_Child_client, options const[0], bytes ptr[in, fidl_test_inheritancewithrecursivedecl_ChildFirstRequest], num_bytes bytesize[bytes], handles ptr[in, fidl_test_inheritancewithrecursivedecl_ChildFirstRequestHandles], num_handles bytesize[handles])
zx_channel_write$fidl_test_inheritancewithrecursivedecl_ChildSecond(handle zx_chan_fidl_test_inheritancewithrecursivedecl_Child_client, options const[0], bytes ptr[in, fidl_test_inheritancewithrecursivedecl_ChildSecondRequest], num_bytes bytesize[bytes], handles ptr[in, fidl_test_inheritancewithrecursivedecl_ChildSecondRequestHandles], num_handles bytesize[handles])

