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

// fidl_experiment = output_index_json

#include <lib/fidl/internal.h>

static const struct FidlCodedArray Array3_34test_encapsulatedstructs_Int16Int8Table;
const struct FidlCodedStruct test_encapsulatedstructs_Int16Int8Table;
static const struct FidlCodedStructPointer Pointer34test_encapsulatedstructs_Int16Int8Table;
static const struct FidlCodedHandle Handlehandle2147483648notnullableTable;

static const struct FidlStructElement Fields39test_encapsulatedstructs_ArrayInt16Int8[] = {
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .field_type = (const fidl_type_t*)&Array3_34test_encapsulatedstructs_Int16Int8Table,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_ArrayInt16Int8Table = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/ArrayInt16Int8",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 12,
    .elements = Fields39test_encapsulatedstructs_ArrayInt16Int8,
    .element_count = 1,
};

static const struct FidlStructElement Fields34test_encapsulatedstructs_Int16Int8[] = {
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding16,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 2,
            .mask_16 = 0xff00,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_Int16Int8Table = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/Int16Int8",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 4,
    .elements = Fields34test_encapsulatedstructs_Int16Int8,
    .element_count = 1,
};

static const struct FidlStructElement Fields34test_encapsulatedstructs_Int8Int32[] = {
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding32,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .mask_32 = 0xffffff00,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_Int8Int32Table = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/Int8Int32",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 8,
    .elements = Fields34test_encapsulatedstructs_Int8Int32,
    .element_count = 1,
};

static const struct FidlStructElement Fields50test_encapsulatedstructs_NonInlineStructTestStruct[] = {
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .field_type = (const fidl_type_t*)&Pointer34test_encapsulatedstructs_Int16Int8Table,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 8,
            .field_type = (const fidl_type_t*)&Handlehandle2147483648notnullableTable,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 8,
            .mask_64 = 0xffffffff00000000,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_NonInlineStructTestStructTable = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/NonInlineStructTestStruct",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 16,
    .elements = Fields50test_encapsulatedstructs_NonInlineStructTestStruct,
    .element_count = 3,
};

static const struct FidlStructElement Fields48test_encapsulatedstructs_StructPaddingTestStruct[] = {
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding32,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .mask_32 = 0xff000000,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding32,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 4,
            .mask_32 = 0xffffff00,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 12,
            .field_type = (const fidl_type_t*)&Array3_34test_encapsulatedstructs_Int16Int8Table,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_StructPaddingTestStructTable = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/StructPaddingTestStruct",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 24,
    .elements = Fields48test_encapsulatedstructs_StructPaddingTestStruct,
    .element_count = 3,
};

static const struct FidlStructElement Fields39test_encapsulatedstructs_TopLevelStruct[] = {
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .mask_64 = 0xffffff00ff000000,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 12,
            .field_type = (const fidl_type_t*)&Array3_34test_encapsulatedstructs_Int16Int8Table,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 24,
            .field_type = (const fidl_type_t*)&Pointer34test_encapsulatedstructs_Int16Int8Table,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 32,
            .field_type = (const fidl_type_t*)&Handlehandle2147483648notnullableTable,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 32,
            .mask_64 = 0xffffffff00000000,
        },
    },
};
const struct FidlCodedStruct test_encapsulatedstructs_TopLevelStructTable = {
    .tag = kFidlTypeStruct,
    .name = "test.encapsulatedstructs/TopLevelStruct",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 40,
    .elements = Fields39test_encapsulatedstructs_TopLevelStruct,
    .element_count = 5,
};

static const struct FidlCodedArray Array3_34test_encapsulatedstructs_Int16Int8Table = {
    .tag = kFidlTypeArray,
    .element = (const fidl_type_t*)&test_encapsulatedstructs_Int16Int8Table,
    .array_size_v2 = 12,
    .element_size_v2 = 4,
};

static const struct FidlCodedHandle Handlehandle2147483648notnullableTable = {
    .tag = kFidlTypeHandle,
    .handle_subtype = ZX_OBJ_TYPE_NONE,
    .handle_rights = 0x80000000,
    .nullable = kFidlNullability_Nonnullable,
};

static const struct FidlCodedStructPointer Pointer34test_encapsulatedstructs_Int16Int8Table = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &test_encapsulatedstructs_Int16Int8Table,
};
