// Code generated by fidlgen; DO NOT EDIT.

package padding

import (
	_bindings "syscall/zx/fidl"
)

type Padding1ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"4" fidl_alignment_v1:"2"`
	A uint16   `fidl_offset_v1:"0"`
	B uint8    `fidl_offset_v1:"2"`
}

var _mPadding1ByteEnd = _bindings.CreateLazyMarshaler(Padding1ByteEnd{})

func (msg *Padding1ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding1ByteEnd
}

type Padding2ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"8" fidl_alignment_v1:"4"`
	A uint32   `fidl_offset_v1:"0"`
	B uint16   `fidl_offset_v1:"4"`
}

var _mPadding2ByteEnd = _bindings.CreateLazyMarshaler(Padding2ByteEnd{})

func (msg *Padding2ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding2ByteEnd
}

type Padding3ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"8" fidl_alignment_v1:"4"`
	A uint32   `fidl_offset_v1:"0"`
	B uint8    `fidl_offset_v1:"4"`
}

var _mPadding3ByteEnd = _bindings.CreateLazyMarshaler(Padding3ByteEnd{})

func (msg *Padding3ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding3ByteEnd
}

type Padding4ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint64   `fidl_offset_v1:"0"`
	B uint32   `fidl_offset_v1:"8"`
}

var _mPadding4ByteEnd = _bindings.CreateLazyMarshaler(Padding4ByteEnd{})

func (msg *Padding4ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding4ByteEnd
}

type Padding5ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint64   `fidl_offset_v1:"0"`
	B uint16   `fidl_offset_v1:"8"`
	C uint8    `fidl_offset_v1:"10"`
}

var _mPadding5ByteEnd = _bindings.CreateLazyMarshaler(Padding5ByteEnd{})

func (msg *Padding5ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding5ByteEnd
}

type Padding6ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint64   `fidl_offset_v1:"0"`
	B uint16   `fidl_offset_v1:"8"`
}

var _mPadding6ByteEnd = _bindings.CreateLazyMarshaler(Padding6ByteEnd{})

func (msg *Padding6ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding6ByteEnd
}

type Padding7ByteEnd struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint64   `fidl_offset_v1:"0"`
	B uint8    `fidl_offset_v1:"8"`
}

var _mPadding7ByteEnd = _bindings.CreateLazyMarshaler(Padding7ByteEnd{})

func (msg *Padding7ByteEnd) Marshaler() _bindings.Marshaler {
	return _mPadding7ByteEnd
}

type Padding1ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"4" fidl_alignment_v1:"2"`
	A uint8    `fidl_offset_v1:"0"`
	B uint16   `fidl_offset_v1:"2"`
}

var _mPadding1ByteMiddle = _bindings.CreateLazyMarshaler(Padding1ByteMiddle{})

func (msg *Padding1ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding1ByteMiddle
}

type Padding2ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"8" fidl_alignment_v1:"4"`
	A uint16   `fidl_offset_v1:"0"`
	B uint32   `fidl_offset_v1:"4"`
}

var _mPadding2ByteMiddle = _bindings.CreateLazyMarshaler(Padding2ByteMiddle{})

func (msg *Padding2ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding2ByteMiddle
}

type Padding3ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"8" fidl_alignment_v1:"4"`
	A uint8    `fidl_offset_v1:"0"`
	B uint32   `fidl_offset_v1:"4"`
}

var _mPadding3ByteMiddle = _bindings.CreateLazyMarshaler(Padding3ByteMiddle{})

func (msg *Padding3ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding3ByteMiddle
}

type Padding4ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint32   `fidl_offset_v1:"0"`
	B uint64   `fidl_offset_v1:"8"`
}

var _mPadding4ByteMiddle = _bindings.CreateLazyMarshaler(Padding4ByteMiddle{})

func (msg *Padding4ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding4ByteMiddle
}

type Padding5ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint16   `fidl_offset_v1:"0"`
	B uint8    `fidl_offset_v1:"2"`
	C uint64   `fidl_offset_v1:"8"`
}

var _mPadding5ByteMiddle = _bindings.CreateLazyMarshaler(Padding5ByteMiddle{})

func (msg *Padding5ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding5ByteMiddle
}

type Padding6ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint16   `fidl_offset_v1:"0"`
	B uint64   `fidl_offset_v1:"8"`
}

var _mPadding6ByteMiddle = _bindings.CreateLazyMarshaler(Padding6ByteMiddle{})

func (msg *Padding6ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding6ByteMiddle
}

type Padding7ByteMiddle struct {
	_ struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	A uint8    `fidl_offset_v1:"0"`
	B uint64   `fidl_offset_v1:"8"`
}

var _mPadding7ByteMiddle = _bindings.CreateLazyMarshaler(Padding7ByteMiddle{})

func (msg *Padding7ByteMiddle) Marshaler() _bindings.Marshaler {
	return _mPadding7ByteMiddle
}

type Padding4ByteAlignmentLength12 struct {
	_ struct{} `fidl:"s" fidl_size_v1:"12" fidl_alignment_v1:"4"`
	A uint32   `fidl_offset_v1:"0"`
	B uint8    `fidl_offset_v1:"4"`
	C uint16   `fidl_offset_v1:"6"`
	D uint16   `fidl_offset_v1:"8"`
}

var _mPadding4ByteAlignmentLength12 = _bindings.CreateLazyMarshaler(Padding4ByteAlignmentLength12{})

func (msg *Padding4ByteAlignmentLength12) Marshaler() _bindings.Marshaler {
	return _mPadding4ByteAlignmentLength12
}

type Padding2ByteAlignmentLength6 struct {
	_ struct{} `fidl:"s" fidl_size_v1:"6" fidl_alignment_v1:"2"`
	A uint8    `fidl_offset_v1:"0"`
	B uint16   `fidl_offset_v1:"2"`
	C uint8    `fidl_offset_v1:"4"`
}

var _mPadding2ByteAlignmentLength6 = _bindings.CreateLazyMarshaler(Padding2ByteAlignmentLength6{})

func (msg *Padding2ByteAlignmentLength6) Marshaler() _bindings.Marshaler {
	return _mPadding2ByteAlignmentLength6
}
