package kmsg

import (
	"context"
	"fmt"
	"reflect"
	"strings"

	"github.com/twmb/franz-go/pkg/kmsg/internal/kbin"
)

// Code generated by franz-go/generate. DO NOT EDIT.

// MaxKey is the maximum key used for any messages in this package.
// Note that this value will change as Kafka adds more messages.
const MaxKey = 92

type AssignmentTopicPartition struct {
	TopicID [16]byte

	Topic string

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignmentTopicPartition.
func (v *AssignmentTopicPartition) Default() {
}

// NewAssignmentTopicPartition returns a default AssignmentTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignmentTopicPartition() AssignmentTopicPartition {
	var v AssignmentTopicPartition
	v.Default()
	return v
}

type TopicInfoConfig struct {
	// Key is the config key.
	Key string

	// Value is the config value.
	Value string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TopicInfoConfig.
func (v *TopicInfoConfig) Default() {
}

// NewTopicInfoConfig returns a default TopicInfoConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewTopicInfoConfig() TopicInfoConfig {
	var v TopicInfoConfig
	v.Default()
	return v
}

// MessageV0 is the message format Kafka used prior to 0.10.
//
// To produce or fetch messages, Kafka would write many messages contiguously
// as an array without specifying the array length.
type MessageV0 struct {
	// Offset is the offset of this record.
	//
	// If this is the outer message of a recursive message set (i.e. a
	// message set has been compressed and this is the outer message),
	// then the offset should be the offset of the last inner value.
	Offset int64

	// MessageSize is the size of everything that follows in this message.
	MessageSize int32

	// CRC is the crc of everything that follows this field (NOT using the
	// Castagnoli polynomial, as is the case in the 0.11+ RecordBatch).
	CRC int32

	// Magic is 0.
	Magic int8

	// Attributes describe the attributes of this message.
	//
	// The first three bits correspond to compression:
	//   - 00 is no compression
	//   - 01 is gzip compression
	//   - 10 is snappy compression
	//
	// The remaining bits are unused and must be 0.
	Attributes int8

	// Key is an blob of data for a record.
	//
	// Key's are usually used for hashing the record to specific Kafka partitions.
	Key []byte

	// Value is a blob of data. This field is the main "message" portion of a
	// record.
	Value []byte
}

func (v *MessageV0) AppendTo(dst []byte) []byte {
	{
		v := v.Offset
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.MessageSize
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.CRC
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Magic
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Attributes
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Key
		dst = kbin.AppendNullableBytes(dst, v)
	}
	{
		v := v.Value
		dst = kbin.AppendNullableBytes(dst, v)
	}
	return dst
}

func (v *MessageV0) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *MessageV0) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *MessageV0) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	s := v
	{
		v := b.Int64()
		s.Offset = v
	}
	{
		v := b.Int32()
		s.MessageSize = v
	}
	{
		v := b.Int32()
		s.CRC = v
	}
	{
		v := b.Int8()
		s.Magic = v
	}
	{
		v := b.Int8()
		s.Attributes = v
	}
	{
		v := b.NullableBytes()
		s.Key = v
	}
	{
		v := b.NullableBytes()
		s.Value = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MessageV0.
func (v *MessageV0) Default() {
}

// NewMessageV0 returns a default MessageV0
// This is a shortcut for creating a struct and calling Default yourself.
func NewMessageV0() MessageV0 {
	var v MessageV0
	v.Default()
	return v
}

// MessageV1 is the message format Kafka used prior to 0.11.
//
// To produce or fetch messages, Kafka would write many messages contiguously
// as an array without specifying the array length.
//
// To support compression, an entire message set would be compressed and used
// as the Value in another message set (thus being "recursive"). The key for
// this outer message set must be null.
type MessageV1 struct {
	// Offset is the offset of this record.
	//
	// Different from v0, if this message set is a recursive message set
	// (that is, compressed and inside another message set), the offset
	// on the inner set is relative to the offset of the outer set.
	Offset int64

	// MessageSize is the size of everything that follows in this message.
	MessageSize int32

	// CRC is the crc of everything that follows this field (NOT using the
	// Castagnoli polynomial, as is the case in the 0.11+ RecordBatch).
	CRC int32

	// Magic is 1.
	Magic int8

	// Attributes describe the attributes of this message.
	//
	// The first three bits correspond to compression:
	//   - 00 is no compression
	//   - 01 is gzip compression
	//   - 10 is snappy compression
	//
	// Bit 4 is the timestamp type, with 0 meaning CreateTime corresponding
	// to the timestamp being from the producer, and 1 meaning LogAppendTime
	// corresponding to the timestamp being from the broker.
	// Setting this to LogAppendTime will cause batches to be rejected.
	//
	// The remaining bits are unused and must be 0.
	Attributes int8

	// Timestamp is the millisecond timestamp of this message.
	Timestamp int64

	// Key is an blob of data for a record.
	//
	// Key's are usually used for hashing the record to specific Kafka partitions.
	Key []byte

	// Value is  a blob of data. This field is the main "message" portion of a
	// record.
	Value []byte
}

func (v *MessageV1) AppendTo(dst []byte) []byte {
	{
		v := v.Offset
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.MessageSize
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.CRC
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Magic
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Attributes
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Timestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Key
		dst = kbin.AppendNullableBytes(dst, v)
	}
	{
		v := v.Value
		dst = kbin.AppendNullableBytes(dst, v)
	}
	return dst
}

func (v *MessageV1) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *MessageV1) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *MessageV1) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	s := v
	{
		v := b.Int64()
		s.Offset = v
	}
	{
		v := b.Int32()
		s.MessageSize = v
	}
	{
		v := b.Int32()
		s.CRC = v
	}
	{
		v := b.Int8()
		s.Magic = v
	}
	{
		v := b.Int8()
		s.Attributes = v
	}
	{
		v := b.Int64()
		s.Timestamp = v
	}
	{
		v := b.NullableBytes()
		s.Key = v
	}
	{
		v := b.NullableBytes()
		s.Value = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MessageV1.
func (v *MessageV1) Default() {
}

// NewMessageV1 returns a default MessageV1
// This is a shortcut for creating a struct and calling Default yourself.
func NewMessageV1() MessageV1 {
	var v MessageV1
	v.Default()
	return v
}

// Header is user provided metadata for a record. Kafka does not look at
// headers at all; they are solely for producers and consumers.
type Header struct {
	Key string

	Value []byte
}

func (v *Header) AppendTo(dst []byte) []byte {
	{
		v := v.Key
		dst = kbin.AppendVarintString(dst, v)
	}
	{
		v := v.Value
		dst = kbin.AppendVarintBytes(dst, v)
	}
	return dst
}

func (v *Header) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *Header) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *Header) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeVarintString()
		} else {
			v = b.VarintString()
		}
		s.Key = v
	}
	{
		v := b.VarintBytes()
		s.Value = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to Header.
func (v *Header) Default() {
}

// NewHeader returns a default Header
// This is a shortcut for creating a struct and calling Default yourself.
func NewHeader() Header {
	var v Header
	v.Default()
	return v
}

// RecordBatch is a Kafka concept that groups many individual records together
// in a more optimized format.
type RecordBatch struct {
	// FirstOffset is the first offset in a record batch.
	//
	// For producing, this is usually 0.
	FirstOffset int64

	// Length is the wire length of everything that follows this field.
	Length int32

	// PartitionLeaderEpoch is the leader epoch of the broker at the time
	// this batch was written. Kafka uses this for cluster communication,
	// but clients can also use this to better aid truncation detection.
	// See KIP-320. Producers should set this to -1.
	PartitionLeaderEpoch int32

	// Magic is the current "magic" number of this message format.
	// The current magic number is 2.
	Magic int8

	// CRC is the crc of everything that follows this field using the
	// Castagnoli polynomial.
	CRC int32

	// Attributes describe the records array of this batch.
	//
	// The first three bits correspond to compression:
	//   - 000 is no compression
	//   - 001 is gzip compression
	//   - 010 is snappy compression
	//   - 011 is lz4 compression
	//   - 100 is zstd compression (produce request version 7+)
	//
	// Bit 4 is the timestamp type, with 0 meaning CreateTime corresponding
	// to the timestamp being from the producer, and 1 meaning LogAppendTime
	// corresponding to the timestamp being from the broker.
	// Setting this to LogAppendTime will cause batches to be rejected.
	//
	// Bit 5 indicates whether the batch is part of a transaction (1 is yes).
	//
	// Bit 6 indicates if the batch includes a control message (1 is yes).
	// Control messages are used to enable transactions and are generated from
	// the broker. Clients should not return control batches to applications.
	Attributes int16

	// LastOffsetDelta is the offset of the last message in a batch. This is used
	// by the broker to ensure correct behavior even with batch compaction.
	LastOffsetDelta int32

	// FirstTimestamp is the timestamp (in milliseconds) of the first record
	// in a batch.
	FirstTimestamp int64

	// MaxTimestamp is the timestamp (in milliseconds) of the last record
	// in a batch. Similar to LastOffsetDelta, this is used to ensure correct
	// behavior with compacting.
	MaxTimestamp int64

	// ProducerID is the broker assigned producerID from an InitProducerID
	// request.
	//
	// Clients that wish to support idempotent messages and transactions must
	// set this field.
	//
	// Note that when not using transactions, any producer here is always
	// accepted (and the epoch is always zero). Outside transactions, the ID
	// is used only to deduplicate requests (and there must be at max 5
	// concurrent requests).
	ProducerID int64

	// ProducerEpoch is the broker assigned producerEpoch from an InitProducerID
	// request.
	//
	// Clients that wish to support idempotent messages and transactions must
	// set this field.
	ProducerEpoch int16

	// FirstSequence is the producer assigned sequence number used by the
	// broker to deduplicate messages.
	//
	// Clients that wish to support idempotent messages and transactions must
	// set this field.
	//
	// The sequence number for each record in a batch is OffsetDelta + FirstSequence.
	FirstSequence int32

	// NumRecords is the number of records in the array below.
	//
	// This is separate from Records due to the potential for records to be
	// compressed.
	NumRecords int32

	// Records contains records, either compressed or uncompressed.
	//
	// For uncompressed records, this is an array of records ([Record]).
	//
	// For compressed records, the length of the uncompressed array is kept
	// but everything that follows is compressed.
	//
	// The number of bytes is expected to be the Length field minus 49.
	Records []byte
}

func (v *RecordBatch) AppendTo(dst []byte) []byte {
	{
		v := v.FirstOffset
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Length
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.PartitionLeaderEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Magic
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.CRC
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Attributes
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.LastOffsetDelta
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.FirstTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.MaxTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.FirstSequence
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.NumRecords
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Records
		dst = append(dst, v...)
	}
	return dst
}

func (v *RecordBatch) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *RecordBatch) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *RecordBatch) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	s := v
	{
		v := b.Int64()
		s.FirstOffset = v
	}
	{
		v := b.Int32()
		s.Length = v
	}
	{
		v := b.Int32()
		s.PartitionLeaderEpoch = v
	}
	{
		v := b.Int8()
		s.Magic = v
	}
	{
		v := b.Int32()
		s.CRC = v
	}
	{
		v := b.Int16()
		s.Attributes = v
	}
	{
		v := b.Int32()
		s.LastOffsetDelta = v
	}
	{
		v := b.Int64()
		s.FirstTimestamp = v
	}
	{
		v := b.Int64()
		s.MaxTimestamp = v
	}
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	{
		v := b.Int32()
		s.FirstSequence = v
	}
	{
		v := b.Int32()
		s.NumRecords = v
	}
	{
		v := b.Span(int(s.Length) - 49)
		s.Records = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to RecordBatch.
func (v *RecordBatch) Default() {
}

// NewRecordBatch returns a default RecordBatch
// This is a shortcut for creating a struct and calling Default yourself.
func NewRecordBatch() RecordBatch {
	var v RecordBatch
	v.Default()
	return v
}

// OffsetCommitKey is the key for the Kafka internal __consumer_offsets topic
// if the key starts with an int16 with a value of 0 or 1.
//
// This type was introduced in KAFKA-1012 commit a670537aa3 with release 0.8.2
// and has been in use ever since.
type OffsetCommitKey struct {
	// Version is which encoding version this value is using.
	Version int16

	// Group is the group being committed.
	Group string

	// Topic is the topic being committed.
	Topic string

	// Partition is the partition being committed.
	Partition int32
}

func (v *OffsetCommitKey) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Group
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.Topic
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.Partition
		dst = kbin.AppendInt32(dst, v)
	}
	return dst
}

func (v *OffsetCommitKey) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetCommitKey) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetCommitKey) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Group = v
	}
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Topic = v
	}
	{
		v := b.Int32()
		s.Partition = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitKey.
func (v *OffsetCommitKey) Default() {
}

// NewOffsetCommitKey returns a default OffsetCommitKey
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitKey() OffsetCommitKey {
	var v OffsetCommitKey
	v.Default()
	return v
}

// OffsetCommitValue is the value for the Kafka internal __consumer_offsets
// topic if the key is of OffsetCommitKey type.
//
// Version 0 was introduced with the key version 0.
//
// KAFKA-1634 commit c5df2a8e3a in 0.9.0 released version 1.
//
// KAFKA-4682 commit 418a91b5d4, proposed in KIP-211 and included in 2.1.0
// released version 2.
//
// KAFKA-7437 commit 9f7267dd2f, proposed in KIP-320 and included in 2.1.0
// released version 3.
//
// KAFKA-19141 commit 199772a included in 4.1.0 released version 4.
type OffsetCommitValue struct {
	// Version is which encoding version this value is using.
	Version int16

	// Offset is the committed offset.
	Offset int64

	// LeaderEpoch is the epoch of the leader committing this message.
	LeaderEpoch int32 // v3+

	// Metadata is the metadata included in the commit.
	Metadata string

	// CommitTimestamp is when this commit occurred.
	CommitTimestamp int64

	// ExpireTimestamp, introduced in v1 and dropped in v2 with KIP-111,
	// is when this commit expires.
	ExpireTimestamp int64 // v1-v1

	// TopicID is the topic id of the committed offset
	TopicID [16]byte // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (v *OffsetCommitValue) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Offset
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 3 {
		v := v.LeaderEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Metadata
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.CommitTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 1 && version <= 1 {
		v := v.ExpireTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if v.TopicID != [16]byte{} {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.TopicID
					dst = kbin.AppendUvarint(dst, 0)
					dst = kbin.AppendUvarint(dst, 16)
					dst = kbin.AppendUuid(dst, v)
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetCommitValue) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetCommitValue) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetCommitValue) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		v := b.Int64()
		s.Offset = v
	}
	if version >= 3 {
		v := b.Int32()
		s.LeaderEpoch = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Metadata = v
	}
	{
		v := b.Int64()
		s.CommitTimestamp = v
	}
	if version >= 1 && version <= 1 {
		v := b.Int64()
		s.ExpireTimestamp = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Uuid()
				s.TopicID = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}
func (v *OffsetCommitValue) IsFlexible() bool { return v.Version >= 4 }

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitValue.
func (v *OffsetCommitValue) Default() {
}

// NewOffsetCommitValue returns a default OffsetCommitValue
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitValue() OffsetCommitValue {
	var v OffsetCommitValue
	v.Default()
	return v
}

// GroupMetadataKey is the key for the Kafka internal __consumer_offsets topic
// if the key starts with an int16 with a value of 2.
//
// This type was introduced in KAFKA-2017 commit 7c33475274 with release 0.9.0
// and has been in use ever since.
type GroupMetadataKey struct {
	// Version is which encoding version this value is using.
	Version int16

	// Group is the group this metadata is for.
	Group string
}

func (v *GroupMetadataKey) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Group
		dst = kbin.AppendString(dst, v)
	}
	return dst
}

func (v *GroupMetadataKey) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *GroupMetadataKey) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *GroupMetadataKey) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Group = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to GroupMetadataKey.
func (v *GroupMetadataKey) Default() {
}

// NewGroupMetadataKey returns a default GroupMetadataKey
// This is a shortcut for creating a struct and calling Default yourself.
func NewGroupMetadataKey() GroupMetadataKey {
	var v GroupMetadataKey
	v.Default()
	return v
}

type GroupMetadataValueMember struct {
	// MemberID is a group member.
	MemberID string

	// InstanceID is the instance ID of this member in the group (KIP-345).
	InstanceID *string // v3+

	// ClientID is the client ID of this group member.
	ClientID string

	// ClientHost is the hostname of this group member.
	ClientHost string

	// RebalanceTimeoutMillis is the rebalance timeout of this group member.
	//
	// This field has a default of -1.
	RebalanceTimeoutMillis int32 // v1+

	// SessionTimeoutMillis is the session timeout of this group member.
	SessionTimeoutMillis int32

	// Subscription is the subscription of this group member.
	Subscription []byte

	// Assignment is what the leader assigned this group member.
	Assignment []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to GroupMetadataValueMember.
func (v *GroupMetadataValueMember) Default() {
	v.RebalanceTimeoutMillis = -1
}

// NewGroupMetadataValueMember returns a default GroupMetadataValueMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewGroupMetadataValueMember() GroupMetadataValueMember {
	var v GroupMetadataValueMember
	v.Default()
	return v
}

// GroupMetadataValue is the value for the Kafka internal __consumer_offsets
// topic if the key is of GroupMetadataKey type.
//
// Version 0 was introduced with the key version 0.
//
// KAFKA-3888 commit 40b1dd3f49, proposed in KIP-62 and included in 0.10.1
// released version 1.
//
// KAFKA-4682 commit 418a91b5d4, proposed in KIP-211 and included in 2.1.0
// released version 2.
//
// KAFKA-7862 commit 0f995ba6be, proposed in KIP-345 and included in 2.3.0
// released version 3.
type GroupMetadataValue struct {
	// Version is the version of this value.
	Version int16

	// ProtocolType is the type of protocol being used for the group
	// (i.e., "consumer").
	ProtocolType string

	// Generation is the generation of this group.
	Generation int32

	// Protocol is the agreed upon protocol all members are using to partition
	// (i.e., "sticky").
	Protocol *string

	// Leader is the group leader.
	Leader *string

	// CurrentStateTimestamp is the timestamp for this state of the group
	// (stable, etc.).
	//
	// This field has a default of -1.
	CurrentStateTimestamp int64 // v2+

	// Members are the group members.
	Members []GroupMetadataValueMember

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (v *GroupMetadataValue) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ProtocolType
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Protocol
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Leader
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 2 {
		v := v.CurrentStateTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Members
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 3 {
				v := v.InstanceID
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ClientID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ClientHost
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 1 {
				v := v.RebalanceTimeoutMillis
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.SessionTimeoutMillis
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Subscription
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			{
				v := v.Assignment
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *GroupMetadataValue) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *GroupMetadataValue) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *GroupMetadataValue) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ProtocolType = v
	}
	{
		v := b.Int32()
		s.Generation = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Protocol = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Leader = v
	}
	if version >= 2 {
		v := b.Int64()
		s.CurrentStateTimestamp = v
	}
	{
		v := s.Members
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]GroupMetadataValueMember, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.MemberID = v
			}
			if version >= 3 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.InstanceID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ClientID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ClientHost = v
			}
			if version >= 1 {
				v := b.Int32()
				s.RebalanceTimeoutMillis = v
			}
			{
				v := b.Int32()
				s.SessionTimeoutMillis = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.Subscription = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.Assignment = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Members = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}
func (v *GroupMetadataValue) IsFlexible() bool { return v.Version >= 4 }

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to GroupMetadataValue.
func (v *GroupMetadataValue) Default() {
	v.CurrentStateTimestamp = -1
}

// NewGroupMetadataValue returns a default GroupMetadataValue
// This is a shortcut for creating a struct and calling Default yourself.
func NewGroupMetadataValue() GroupMetadataValue {
	var v GroupMetadataValue
	v.Default()
	return v
}

// TxnMetadataKey is the key for the Kafka internal __transaction_state topic
// if the key starts with an int16 with a value of 0.
type TxnMetadataKey struct {
	// Version is the version of this type.
	Version int16

	// TransactionalID is the transactional ID this record is for.
	TransactionalID string
}

func (v *TxnMetadataKey) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.TransactionalID
		dst = kbin.AppendString(dst, v)
	}
	return dst
}

func (v *TxnMetadataKey) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *TxnMetadataKey) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *TxnMetadataKey) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.TransactionalID = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnMetadataKey.
func (v *TxnMetadataKey) Default() {
}

// NewTxnMetadataKey returns a default TxnMetadataKey
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnMetadataKey() TxnMetadataKey {
	var v TxnMetadataKey
	v.Default()
	return v
}

type TxnMetadataValueTopic struct {
	// Topic is a topic involved in this transaction.
	Topic string

	// Partitions are partitions in this topic involved in the transaction.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnMetadataValueTopic.
func (v *TxnMetadataValueTopic) Default() {
}

// NewTxnMetadataValueTopic returns a default TxnMetadataValueTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnMetadataValueTopic() TxnMetadataValueTopic {
	var v TxnMetadataValueTopic
	v.Default()
	return v
}

// TxnMetadataValue is the value for the Kafka internal __transaction_state
// topic if the key is of TxnMetadataKey type.
//
// Version 0 was introduced in 0.11.0.
//
// KAFKA-14869 commit 4b6dcf19dc, proposed in KIP-915 and included in 3.5
// released version 1.
type TxnMetadataValue struct {
	// Version is the version of this value.
	Version int16

	// ProducerID is the ID in use by the transactional ID.
	ProducerID int64

	// ProducerEpoch is the epoch associated with the producer ID.
	ProducerEpoch int16

	// TimeoutMillis is the timeout of this transaction in milliseconds.
	TimeoutMillis int32

	// State is the state this transaction is in,
	// 0 is Empty, 1 is Ongoing, 2 is PrepareCommit, 3 is PrepareAbort, 4 is
	// CompleteCommit, 5 is CompleteAbort, 6 is Dead, and 7 is PrepareEpochFence.
	State TransactionState

	// Topics are topics that are involved in this transaction.
	Topics []TxnMetadataValueTopic

	// LastUpdateTimestamp is the timestamp in millis of when this transaction
	// was last updated.
	LastUpdateTimestamp int64

	// StartTimestamp is the timestamp in millis of when this transaction started.
	StartTimestamp int64

	// PreviousProducerID is the producer ID used by the last committed
	// transaction. KAFKA-14562 commit ede0c94aaa, proposed in KIP-890 and
	// included in 4.0.
	//
	// This field has a default of -1.
	PreviousProducerID int64 // tag 0

	// NextProducerID is the latest producer ID sent to the producer for the
	// given transactional ID. KAFKA-14562 commit ede0c94aaa, proposed in
	// KIP-890 and included in 4.0.
	//
	// This field has a default of -1.
	NextProducerID int64 // tag 1

	// ClientTransactionVersion is the transaction version used by the client.
	// KAFKA-14562 commit ede0c94aaa, proposed in KIP-890 and included in 4.0.
	ClientTransactionVersion int16 // tag 2

	// NextProducerEpoch is the producer epoch associated with NextProducerID.
	// KAFKA-15370 commit 247c0f0ba5, proposed in KIP-939 and included in 4.1.0.
	//
	// This field has a default of -1.
	NextProducerEpoch int16 // tag 3

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (v *TxnMetadataValue) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.State
		{
			v := int8(v)
			dst = kbin.AppendInt8(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.LastUpdateTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.StartTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if v.PreviousProducerID != -1 {
			toEncode = append(toEncode, 0)
		}
		if v.NextProducerID != -1 {
			toEncode = append(toEncode, 1)
		}
		if v.ClientTransactionVersion != 0 {
			toEncode = append(toEncode, 2)
		}
		if v.NextProducerEpoch != -1 {
			toEncode = append(toEncode, 3)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.PreviousProducerID
					dst = kbin.AppendUvarint(dst, 0)
					dst = kbin.AppendUvarint(dst, 8)
					dst = kbin.AppendInt64(dst, v)
				}
			case 1:
				{
					v := v.NextProducerID
					dst = kbin.AppendUvarint(dst, 1)
					dst = kbin.AppendUvarint(dst, 8)
					dst = kbin.AppendInt64(dst, v)
				}
			case 2:
				{
					v := v.ClientTransactionVersion
					dst = kbin.AppendUvarint(dst, 2)
					dst = kbin.AppendUvarint(dst, 2)
					dst = kbin.AppendInt16(dst, v)
				}
			case 3:
				{
					v := v.NextProducerEpoch
					dst = kbin.AppendUvarint(dst, 3)
					dst = kbin.AppendUvarint(dst, 2)
					dst = kbin.AppendInt16(dst, v)
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *TxnMetadataValue) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *TxnMetadataValue) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *TxnMetadataValue) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		var t TransactionState
		{
			v := b.Int8()
			t = TransactionState(v)
		}
		v := t
		s.State = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TxnMetadataValueTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TxnMetadataValueTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int64()
		s.LastUpdateTimestamp = v
	}
	{
		v := b.Int64()
		s.StartTimestamp = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Int64()
				s.PreviousProducerID = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 1:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Int64()
				s.NextProducerID = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 2:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Int16()
				s.ClientTransactionVersion = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 3:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Int16()
				s.NextProducerEpoch = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}
func (v *TxnMetadataValue) IsFlexible() bool { return v.Version >= 1 }

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnMetadataValue.
func (v *TxnMetadataValue) Default() {
	v.PreviousProducerID = -1
	v.NextProducerID = -1
	v.NextProducerEpoch = -1
}

// NewTxnMetadataValue returns a default TxnMetadataValue
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnMetadataValue() TxnMetadataValue {
	var v TxnMetadataValue
	v.Default()
	return v
}

type StickyMemberMetadataCurrentAssignment struct {
	// Topic is a topic the group member is currently assigned.
	Topic string

	// Partitions are the partitions within a topic that a group member is
	// currently assigned.
	Partitions []int32
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StickyMemberMetadataCurrentAssignment.
func (v *StickyMemberMetadataCurrentAssignment) Default() {
}

// NewStickyMemberMetadataCurrentAssignment returns a default StickyMemberMetadataCurrentAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewStickyMemberMetadataCurrentAssignment() StickyMemberMetadataCurrentAssignment {
	var v StickyMemberMetadataCurrentAssignment
	v.Default()
	return v
}

// StickyMemberMetadata is is what is encoded in UserData for
// ConsumerMemberMetadata in group join requests with the sticky partitioning
// strategy.
//
// V1 added generation, which fixed a bug with flaky group members joining
// repeatedly. See KIP-341 for more details.
//
// Note that clients should always try decoding as v1 and, if that fails,
// fall back to v0. This is necessary due to there being no version number
// anywhere in this type.
type StickyMemberMetadata struct {
	// CurrentAssignment is the assignment that a group member has when
	// issuing a join.
	CurrentAssignment []StickyMemberMetadataCurrentAssignment

	// Generation is the generation of this join. This is incremented every join.
	//
	// This field has a default of -1.
	Generation int32 // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StickyMemberMetadata.
func (v *StickyMemberMetadata) Default() {
	v.Generation = -1
}

// NewStickyMemberMetadata returns a default StickyMemberMetadata
// This is a shortcut for creating a struct and calling Default yourself.
func NewStickyMemberMetadata() StickyMemberMetadata {
	var v StickyMemberMetadata
	v.Default()
	return v
}

type ConsumerMemberMetadataOwnedPartition struct {
	Topic string

	Partitions []int32
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerMemberMetadataOwnedPartition.
func (v *ConsumerMemberMetadataOwnedPartition) Default() {
}

// NewConsumerMemberMetadataOwnedPartition returns a default ConsumerMemberMetadataOwnedPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerMemberMetadataOwnedPartition() ConsumerMemberMetadataOwnedPartition {
	var v ConsumerMemberMetadataOwnedPartition
	v.Default()
	return v
}

// ConsumerMemberMetadata is the metadata that is usually sent with a join group
// request with the "consumer" protocol (normal, non-connect consumers).
type ConsumerMemberMetadata struct {
	// Version is 0, 1, 2, or 3.
	Version int16

	// Topics is the list of topics in the group that this member is interested
	// in consuming.
	Topics []string

	// UserData is arbitrary client data for a given client in the group.
	// For sticky assignment, this is StickyMemberMetadata.
	UserData []byte

	// OwnedPartitions, introduced for KIP-429, are the partitions that this
	// member currently owns.
	OwnedPartitions []ConsumerMemberMetadataOwnedPartition // v1+

	// Generation is the generation of the group.
	//
	// This field has a default of -1.
	Generation int32 // v2+

	// Rack, if non-nil, opts into rack-aware replica assignment.
	Rack *string // v3+
}

func (v *ConsumerMemberMetadata) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := v[i]
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.UserData
		dst = kbin.AppendNullableBytes(dst, v)
	}
	if version >= 1 {
		v := v.OwnedPartitions
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Partitions
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
		}
	}
	if version >= 2 {
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 3 {
		v := v.Rack
		dst = kbin.AppendNullableString(dst, v)
	}
	return dst
}

func (v *ConsumerMemberMetadata) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerMemberMetadata) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerMemberMetadata) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				v = b.UnsafeString()
			} else {
				v = b.String()
			}
			a[i] = v
		}
		v = a
		s.Topics = v
	}
	{
		v := b.NullableBytes()
		s.UserData = v
	}
	if version >= 1 {
		v := s.OwnedPartitions
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConsumerMemberMetadataOwnedPartition, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
		}
		v = a
		s.OwnedPartitions = v
	}
	if version >= 2 {
		v := b.Int32()
		s.Generation = v
	}
	if version >= 3 {
		var v *string
		if unsafe {
			v = b.UnsafeNullableString()
		} else {
			v = b.NullableString()
		}
		s.Rack = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerMemberMetadata.
func (v *ConsumerMemberMetadata) Default() {
	v.Generation = -1
}

// NewConsumerMemberMetadata returns a default ConsumerMemberMetadata
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerMemberMetadata() ConsumerMemberMetadata {
	var v ConsumerMemberMetadata
	v.Default()
	return v
}

type ConsumerMemberAssignmentTopic struct {
	// Topic is a topic in the assignment.
	Topic string

	// Partitions contains partitions in the assignment.
	Partitions []int32
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerMemberAssignmentTopic.
func (v *ConsumerMemberAssignmentTopic) Default() {
}

// NewConsumerMemberAssignmentTopic returns a default ConsumerMemberAssignmentTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerMemberAssignmentTopic() ConsumerMemberAssignmentTopic {
	var v ConsumerMemberAssignmentTopic
	v.Default()
	return v
}

// ConsumerMemberAssignment is the assignment data that is usually sent with a
// sync group request with the "consumer" protocol (normal, non-connect
// consumers).
type ConsumerMemberAssignment struct {
	// Verson is 0, 1, or 2.
	Version int16

	// Topics contains topics in the assignment.
	Topics []ConsumerMemberAssignmentTopic

	// UserData is arbitrary client data for a given client in the group.
	UserData []byte
}

func (v *ConsumerMemberAssignment) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Partitions
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
		}
	}
	{
		v := v.UserData
		dst = kbin.AppendNullableBytes(dst, v)
	}
	return dst
}

func (v *ConsumerMemberAssignment) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerMemberAssignment) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerMemberAssignment) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConsumerMemberAssignmentTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.NullableBytes()
		s.UserData = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerMemberAssignment.
func (v *ConsumerMemberAssignment) Default() {
}

// NewConsumerMemberAssignment returns a default ConsumerMemberAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerMemberAssignment() ConsumerMemberAssignment {
	var v ConsumerMemberAssignment
	v.Default()
	return v
}

// ConnectMemberMetadata is the metadata used in a join group request with the
// "connect" protocol. v1 introduced incremental cooperative rebalancing (akin
// to cooperative-sticky) per KIP-415.
//
//	v0 defined in connect/runtime/src/main/java/org/apache/kafka/connect/runtime/distributed/ConnectProtocol.java
//	v1+ defined in connect/runtime/src/main/java/org/apache/kafka/connect/runtime/distributed/IncrementalCooperativeConnectProtocol.java
type ConnectMemberMetadata struct {
	Version int16

	URL string

	ConfigOffset int64

	CurrentAssignment []byte // v1+
}

func (v *ConnectMemberMetadata) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.URL
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.ConfigOffset
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 1 {
		v := v.CurrentAssignment
		dst = kbin.AppendNullableBytes(dst, v)
	}
	return dst
}

func (v *ConnectMemberMetadata) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConnectMemberMetadata) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConnectMemberMetadata) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.URL = v
	}
	{
		v := b.Int64()
		s.ConfigOffset = v
	}
	if version >= 1 {
		v := b.NullableBytes()
		s.CurrentAssignment = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConnectMemberMetadata.
func (v *ConnectMemberMetadata) Default() {
}

// NewConnectMemberMetadata returns a default ConnectMemberMetadata
// This is a shortcut for creating a struct and calling Default yourself.
func NewConnectMemberMetadata() ConnectMemberMetadata {
	var v ConnectMemberMetadata
	v.Default()
	return v
}

type ConnectMemberAssignmentAssignment struct {
	Connector string

	Tasks []int16
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConnectMemberAssignmentAssignment.
func (v *ConnectMemberAssignmentAssignment) Default() {
}

// NewConnectMemberAssignmentAssignment returns a default ConnectMemberAssignmentAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewConnectMemberAssignmentAssignment() ConnectMemberAssignmentAssignment {
	var v ConnectMemberAssignmentAssignment
	v.Default()
	return v
}

type ConnectMemberAssignmentRevoked struct {
	Connector string

	Tasks []int16
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConnectMemberAssignmentRevoked.
func (v *ConnectMemberAssignmentRevoked) Default() {
}

// NewConnectMemberAssignmentRevoked returns a default ConnectMemberAssignmentRevoked
// This is a shortcut for creating a struct and calling Default yourself.
func NewConnectMemberAssignmentRevoked() ConnectMemberAssignmentRevoked {
	var v ConnectMemberAssignmentRevoked
	v.Default()
	return v
}

// ConnectMemberAssignment is the assignment that is used in a sync group
// request with the "connect" protocol. See ConnectMemberMetadata for links to
// the Kafka code where these fields are defined.
type ConnectMemberAssignment struct {
	Version int16

	Error int16

	Leader string

	LeaderURL string

	ConfigOffset int64

	Assignment []ConnectMemberAssignmentAssignment

	Revoked []ConnectMemberAssignmentRevoked // v1+

	ScheduledDelay int32 // v1+
}

func (v *ConnectMemberAssignment) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Error
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Leader
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.LeaderURL
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.ConfigOffset
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Assignment
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Connector
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Tasks
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt16(dst, v)
				}
			}
		}
	}
	if version >= 1 {
		v := v.Revoked
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Connector
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Tasks
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt16(dst, v)
				}
			}
		}
	}
	if version >= 1 {
		v := v.ScheduledDelay
		dst = kbin.AppendInt32(dst, v)
	}
	return dst
}

func (v *ConnectMemberAssignment) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConnectMemberAssignment) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConnectMemberAssignment) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		v := b.Int16()
		s.Error = v
	}
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Leader = v
	}
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.LeaderURL = v
	}
	{
		v := b.Int64()
		s.ConfigOffset = v
	}
	{
		v := s.Assignment
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConnectMemberAssignmentAssignment, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Connector = v
			}
			{
				v := s.Tasks
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int16, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int16()
					a[i] = v
				}
				v = a
				s.Tasks = v
			}
		}
		v = a
		s.Assignment = v
	}
	if version >= 1 {
		v := s.Revoked
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConnectMemberAssignmentRevoked, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Connector = v
			}
			{
				v := s.Tasks
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int16, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int16()
					a[i] = v
				}
				v = a
				s.Tasks = v
			}
		}
		v = a
		s.Revoked = v
	}
	if version >= 1 {
		v := b.Int32()
		s.ScheduledDelay = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConnectMemberAssignment.
func (v *ConnectMemberAssignment) Default() {
}

// NewConnectMemberAssignment returns a default ConnectMemberAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewConnectMemberAssignment() ConnectMemberAssignment {
	var v ConnectMemberAssignment
	v.Default()
	return v
}

// DefaultPrincipalData is the encoded principal data. This is used in an
// envelope request from broker to broker.
type DefaultPrincipalData struct {
	Version int16

	// The principal type.
	Type string

	// The principal name.
	Name string

	// Whether the principal was authenticated by a delegation token on the forwarding broker.
	TokenAuthenticated bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (v *DefaultPrincipalData) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Type
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Name
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.TokenAuthenticated
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DefaultPrincipalData) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DefaultPrincipalData) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DefaultPrincipalData) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Type = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Name = v
	}
	{
		v := b.Bool()
		s.TokenAuthenticated = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}
func (v *DefaultPrincipalData) IsFlexible() bool { return v.Version >= 0 }

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DefaultPrincipalData.
func (v *DefaultPrincipalData) Default() {
}

// NewDefaultPrincipalData returns a default DefaultPrincipalData
// This is a shortcut for creating a struct and calling Default yourself.
func NewDefaultPrincipalData() DefaultPrincipalData {
	var v DefaultPrincipalData
	v.Default()
	return v
}

// ControlRecordKey is the key in a control record.
type ControlRecordKey struct {
	Version int16

	Type ControlRecordKeyType
}

func (v *ControlRecordKey) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Type
		{
			v := int16(v)
			dst = kbin.AppendInt16(dst, v)
		}
	}
	return dst
}

func (v *ControlRecordKey) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ControlRecordKey) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ControlRecordKey) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		var t ControlRecordKeyType
		{
			v := b.Int16()
			t = ControlRecordKeyType(v)
		}
		v := t
		s.Type = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControlRecordKey.
func (v *ControlRecordKey) Default() {
}

// NewControlRecordKey returns a default ControlRecordKey
// This is a shortcut for creating a struct and calling Default yourself.
func NewControlRecordKey() ControlRecordKey {
	var v ControlRecordKey
	v.Default()
	return v
}

// EndTxnMarker is the value for a control record when the key is type 0 or 1.
type EndTxnMarker struct {
	Version int16

	CoordinatorEpoch int32
}

func (v *EndTxnMarker) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.CoordinatorEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	return dst
}

func (v *EndTxnMarker) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EndTxnMarker) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EndTxnMarker) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	s := v
	{
		v := b.Int32()
		s.CoordinatorEpoch = v
	}
	return b.Complete()
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndTxnMarker.
func (v *EndTxnMarker) Default() {
}

// NewEndTxnMarker returns a default EndTxnMarker
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndTxnMarker() EndTxnMarker {
	var v EndTxnMarker
	v.Default()
	return v
}

type LeaderChangeMessageVoter struct {
	VoterID int32

	// VoterDirectoryID is the directory ID of the voter.
	// KAFKA-16915 commit da8fe6355b, proposed in KIP-853 and included in 3.9.
	VoterDirectoryID [16]byte // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderChangeMessageVoter.
func (v *LeaderChangeMessageVoter) Default() {
}

// NewLeaderChangeMessageVoter returns a default LeaderChangeMessageVoter
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderChangeMessageVoter() LeaderChangeMessageVoter {
	var v LeaderChangeMessageVoter
	v.Default()
	return v
}

// LeaderChangeMessage is the value for a control record when the key is type 2.
type LeaderChangeMessage struct {
	Version int16

	// The ID of the newly elected leader.
	LeaderID int32

	// The set of voters in the quorum for this epoch.
	Voters []LeaderChangeMessageVoter

	// The voters who voted for the leader at the time of election.
	GrantingVoters []LeaderChangeMessageVoter

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (v *LeaderChangeMessage) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Version
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.LeaderID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Voters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.VoterID
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 1 {
				v := v.VoterDirectoryID
				dst = kbin.AppendUuid(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.GrantingVoters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.VoterID
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 1 {
				v := v.VoterDirectoryID
				dst = kbin.AppendUuid(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *LeaderChangeMessage) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *LeaderChangeMessage) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *LeaderChangeMessage) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	v.Version = b.Int16()
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.LeaderID = v
	}
	{
		v := s.Voters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderChangeMessageVoter, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.VoterID = v
			}
			if version >= 1 {
				v := b.Uuid()
				s.VoterDirectoryID = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Voters = v
	}
	{
		v := s.GrantingVoters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderChangeMessageVoter, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.VoterID = v
			}
			if version >= 1 {
				v := b.Uuid()
				s.VoterDirectoryID = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.GrantingVoters = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}
func (v *LeaderChangeMessage) IsFlexible() bool { return v.Version >= 0 }

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderChangeMessage.
func (v *LeaderChangeMessage) Default() {
}

// NewLeaderChangeMessage returns a default LeaderChangeMessage
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderChangeMessage() LeaderChangeMessage {
	var v LeaderChangeMessage
	v.Default()
	return v
}

type ProduceRequestTopicPartition struct {
	// Partition is a partition to send a record batch to.
	Partition int32

	// Records is a batch of records to write to a topic's partition.
	//
	// For Kafka pre 0.11.0, the contents of the byte array is a serialized
	// message set. At or after 0.11.0, the contents of the byte array is a
	// serialized RecordBatch.
	Records []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceRequestTopicPartition.
func (v *ProduceRequestTopicPartition) Default() {
}

// NewProduceRequestTopicPartition returns a default ProduceRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceRequestTopicPartition() ProduceRequestTopicPartition {
	var v ProduceRequestTopicPartition
	v.Default()
	return v
}

type ProduceRequestTopic struct {
	// Topic is a topic to send record batches to.
	Topic string // v0-v12

	// TopicID is the uuid of the topic to produce records to.
	TopicID [16]byte // v13+

	// Partitions is an array of partitions to send record batches to.
	Partitions []ProduceRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceRequestTopic.
func (v *ProduceRequestTopic) Default() {
}

// NewProduceRequestTopic returns a default ProduceRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceRequestTopic() ProduceRequestTopic {
	var v ProduceRequestTopic
	v.Default()
	return v
}

// ProduceRequest issues records to be created to Kafka.
//
// Kafka 0.10.0 (v2) changed Records from MessageSet v0 to MessageSet v1.
// Kafka 0.11.0 (v3) again changed Records to RecordBatch.
//
// Note that the special client ID "__admin_client" will allow you to produce
// records to internal topics. This is generally recommended if you want to
// break your Kafka cluster.
type ProduceRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionID is the transaction ID to use for this request, allowing for
	// exactly once semantics.
	TransactionID *string // v3+

	// Acks specifies the number of acks that the partition leaders must receive
	// from in sync replicas before considering a record batch fully written.
	//
	// Valid values are -1, 0, or 1 corresponding to all, none, or the leader only.
	//
	// Note that if no acks are requested, Kafka will close the connection
	// if any topic or partition errors to trigger a client metadata refresh.
	Acks int16

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 15000.
	TimeoutMillis int32

	// Topics is an array of topics to send record batches to.
	Topics []ProduceRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

func (*ProduceRequest) Key() int16                       { return 0 }
func (*ProduceRequest) MaxVersion() int16                { return 13 }
func (v *ProduceRequest) SetVersion(version int16)       { v.Version = version }
func (v *ProduceRequest) GetVersion() int16              { return v.Version }
func (v *ProduceRequest) IsFlexible() bool               { return v.Version >= 9 }
func (v *ProduceRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *ProduceRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *ProduceRequest) ResponseKind() Response {
	r := &ProduceResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ProduceRequest) RequestWith(ctx context.Context, r Requestor) (*ProduceResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ProduceResponse)
	return resp, err
}

func (v *ProduceRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	if version >= 3 {
		v := v.TransactionID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Acks
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 12 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 13 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Records
						if isFlexible {
							dst = kbin.AppendCompactNullableBytes(dst, v)
						} else {
							dst = kbin.AppendNullableBytes(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ProduceRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ProduceRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ProduceRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	s := v
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.TransactionID = v
	}
	{
		v := b.Int16()
		s.Acks = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ProduceRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 12 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 13 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ProduceRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactNullableBytes()
						} else {
							v = b.NullableBytes()
						}
						s.Records = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrProduceRequest returns a pointer to a default ProduceRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrProduceRequest() *ProduceRequest {
	var v ProduceRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceRequest.
func (v *ProduceRequest) Default() {
	v.TimeoutMillis = 15000
}

// NewProduceRequest returns a default ProduceRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceRequest() ProduceRequest {
	var v ProduceRequest
	v.Default()
	return v
}

type ProduceResponseTopicPartitionErrorRecord struct {
	// RelativeOffset is the offset of the record that caused problems.
	RelativeOffset int32

	// ErrorMessage is the error of this record.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponseTopicPartitionErrorRecord.
func (v *ProduceResponseTopicPartitionErrorRecord) Default() {
}

// NewProduceResponseTopicPartitionErrorRecord returns a default ProduceResponseTopicPartitionErrorRecord
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponseTopicPartitionErrorRecord() ProduceResponseTopicPartitionErrorRecord {
	var v ProduceResponseTopicPartitionErrorRecord
	v.Default()
	return v
}

type ProduceResponseTopicPartitionCurrentLeader struct {
	// The ID of the current leader, or -1 if unknown.
	//
	// This field has a default of -1.
	LeaderID int32

	// The latest known leader epoch.
	//
	// This field has a default of -1.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponseTopicPartitionCurrentLeader.
func (v *ProduceResponseTopicPartitionCurrentLeader) Default() {
	v.LeaderID = -1
	v.LeaderEpoch = -1
}

// NewProduceResponseTopicPartitionCurrentLeader returns a default ProduceResponseTopicPartitionCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponseTopicPartitionCurrentLeader() ProduceResponseTopicPartitionCurrentLeader {
	var v ProduceResponseTopicPartitionCurrentLeader
	v.Default()
	return v
}

type ProduceResponseTopicPartition struct {
	// Partition is the partition this response pertains to.
	Partition int32

	// ErrorCode is any error for a topic/partition in the request.
	// There are many error codes for produce requests.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned for all topics and
	// partitions if the request had a transactional ID but the client
	// is not authorized for transactions.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned for all topics and partitions
	// if the request was idempotent but the client is not authorized
	// for idempotent requests.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned for all topics the client
	// is not authorized to talk to.
	//
	// INVALID_REQUIRED_ACKS is returned if the request contained an invalid
	// number for "acks".
	//
	// CORRUPT_MESSAGE is returned for many reasons, generally related to
	// problems with messages (invalid magic, size mismatch, etc.).
	//
	// MESSAGE_TOO_LARGE is returned if a record batch is larger than the
	// broker's configured max.message.size.
	//
	// RECORD_LIST_TOO_LARGE is returned if the record batch is larger than
	// the broker's segment.bytes.
	//
	// INVALID_TIMESTAMP is returned if the record batch uses LogAppendTime
	// or if the timestamp delta from when the broker receives the message
	// is more than the broker's log.message.timestamp.difference.max.ms.
	//
	// UNSUPPORTED_FOR_MESSAGE_FORMAT is returned if using a Kafka v2 message
	// format (i.e. RecordBatch) feature (idempotence) while sending v1
	// messages (i.e. a MessageSet).
	//
	// KAFKA_STORAGE_ERROR is returned if the log directory for a partition
	// is offline.
	//
	// NOT_ENOUGH_REPLICAS is returned if all acks are required, but there
	// are not enough in sync replicas yet.
	//
	// NOT_ENOUGH_REPLICAS_AFTER_APPEND is returned on old Kafka versions
	// (pre 0.11.0.0) when a message was written to disk and then Kafka
	// noticed not enough replicas existed to replicate the message.
	//
	// DUPLICATE_SEQUENCE_NUMBER is returned for Kafka <1.1.0 when a
	// sequence number is detected as a duplicate. After, out of order
	// is returned.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the topic or partition
	// is unknown.
	//
	// NOT_LEADER_FOR_PARTITION is returned if the broker is not a leader
	// for this partition. This means that the client has stale metadata.
	//
	// INVALID_PRODUCER_EPOCH is returned if the produce request was
	// attempted with an old epoch. Either there is a newer producer using
	// the same transaction ID, or the transaction ID used has expired.
	//
	// UNKNOWN_PRODUCER_ID, added in Kafka 1.0.0 (message format v5+) is
	// returned if the producer used an ID that Kafka does not know about or
	// if the request has a larger sequence number than Kafka expects.  The
	// LogStartOffset must be checked in this case. If the offset is greater
	// than the last acknowledged offset, then no data loss has occurred; the
	// client just sent data so long ago that Kafka rotated the partition out
	// of existence and no longer knows of this producer ID. In this case,
	// reset your sequence numbers to 0. If the log start offset is equal to
	// or less than what the client sent prior, then data loss has occurred.
	// See KAFKA-5793 for more details. NOTE: Unfortunately, even UNKNOWN_PRODUCER_ID
	// is unsafe to handle, so this error should likely be treated the same
	// as OUT_OF_ORDER_SEQUENCE_NUMER. See KIP-360 for more details.
	//
	// OUT_OF_ORDER_SEQUENCE_NUMBER is sent if the batch's FirstSequence was
	// not what it should be (the last FirstSequence, plus the number of
	// records in the last batch, plus one). After 1.0.0, this generally
	// means data loss. Before, there could be confusion on if the broker
	// actually rotated the partition out of existence (this is why
	// UNKNOWN_PRODUCER_ID was introduced).
	//
	// UNKNOWN_TOPIC_ID is returned if producing to an unknown topic ID.
	ErrorCode int16

	// BaseOffset is the offset that the records in the produce request began
	// at in the partition.
	BaseOffset int64

	// LogAppendTime is the millisecond that records were appended to the
	// partition inside Kafka. This is only not -1 if records were written
	// with the log append time flag (which producers cannot do).
	//
	// This field has a default of -1.
	LogAppendTime int64 // v2+

	// LogStartOffset, introduced in Kafka 1.0.0, can be used to see if an
	// UNKNOWN_PRODUCER_ID means Kafka rotated records containing the used
	// producer ID out of existence, or if Kafka lost data.
	//
	// This field has a default of -1.
	LogStartOffset int64 // v5+

	// ErrorRecords are indices of individual records that caused a batch
	// to error. This was added for KIP-467.
	ErrorRecords []ProduceResponseTopicPartitionErrorRecord // v8+

	// ErrorMessage is the global error message of of what caused this batch
	// to error.
	ErrorMessage *string // v8+

	CurrentLeader ProduceResponseTopicPartitionCurrentLeader // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponseTopicPartition.
func (v *ProduceResponseTopicPartition) Default() {
	v.LogAppendTime = -1
	v.LogStartOffset = -1
	{
		v := &v.CurrentLeader
		_ = v
		v.LeaderID = -1
		v.LeaderEpoch = -1
	}
}

// NewProduceResponseTopicPartition returns a default ProduceResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponseTopicPartition() ProduceResponseTopicPartition {
	var v ProduceResponseTopicPartition
	v.Default()
	return v
}

type ProduceResponseTopic struct {
	// Topic is the topic this response pertains to.
	Topic string // v0-v12

	// TopicID is the uuid of the topic produced to.
	TopicID [16]byte // v13+

	// Partitions is an array of responses for the partition's that
	// batches were sent to.
	Partitions []ProduceResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponseTopic.
func (v *ProduceResponseTopic) Default() {
}

// NewProduceResponseTopic returns a default ProduceResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponseTopic() ProduceResponseTopic {
	var v ProduceResponseTopic
	v.Default()
	return v
}

type ProduceResponseBroker struct {
	// NodeID is the node ID of a Kafka broker.
	NodeID int32

	// Host is the hostname of a Kafka broker.
	Host string

	// Port is the port of a Kafka broker.
	Port int32

	// Rack is the rack this Kafka broker is in.
	Rack *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponseBroker.
func (v *ProduceResponseBroker) Default() {
}

// NewProduceResponseBroker returns a default ProduceResponseBroker
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponseBroker() ProduceResponseBroker {
	var v ProduceResponseBroker
	v.Default()
	return v
}

// ProduceResponse is returned from a ProduceRequest.
type ProduceResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics is an array of responses for the topic's that batches were sent
	// to.
	Topics []ProduceResponseTopic

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 6.
	ThrottleMillis int32 // v1+

	// Brokers is present if any partition responses contain the error
	// NOT_LEADER_OR_FOLLOWER.
	Brokers []ProduceResponseBroker // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

func (*ProduceResponse) Key() int16                         { return 0 }
func (*ProduceResponse) MaxVersion() int16                  { return 13 }
func (v *ProduceResponse) SetVersion(version int16)         { v.Version = version }
func (v *ProduceResponse) GetVersion() int16                { return v.Version }
func (v *ProduceResponse) IsFlexible() bool                 { return v.Version >= 9 }
func (v *ProduceResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 6 }
func (v *ProduceResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ProduceResponse) RequestKind() Request             { return &ProduceRequest{Version: v.Version} }

func (v *ProduceResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 12 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 13 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.BaseOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 2 {
						v := v.LogAppendTime
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 5 {
						v := v.LogStartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 8 {
						v := v.ErrorRecords
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.RelativeOffset
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ErrorMessage
								if isFlexible {
									dst = kbin.AppendCompactNullableString(dst, v)
								} else {
									dst = kbin.AppendNullableString(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if version >= 8 {
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						var toEncode []uint32
						if !reflect.DeepEqual(v.CurrentLeader, (func() ProduceResponseTopicPartitionCurrentLeader {
							var v ProduceResponseTopicPartitionCurrentLeader
							v.Default()
							return v
						})()) {
							toEncode = append(toEncode, 0)
						}
						dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
						for _, tag := range toEncode {
							switch tag {
							case 0:
								{
									v := v.CurrentLeader
									dst = kbin.AppendUvarint(dst, 0)
									sized := false
									lenAt := len(dst)
								fCurrentLeader:
									{
										v := v.LeaderID
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.LeaderEpoch
										dst = kbin.AppendInt32(dst, v)
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
									if !sized {
										dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
										sized = true
										goto fCurrentLeader
									}
								}
							}
						}
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.Brokers) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.Brokers
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fBrokers:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						{
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						{
							v := v.Port
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.Rack
							if isFlexible {
								dst = kbin.AppendCompactNullableString(dst, v)
							} else {
								dst = kbin.AppendNullableString(dst, v)
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fBrokers
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ProduceResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ProduceResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ProduceResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ProduceResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 12 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 13 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ProduceResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int64()
						s.BaseOffset = v
					}
					if version >= 2 {
						v := b.Int64()
						s.LogAppendTime = v
					}
					if version >= 5 {
						v := b.Int64()
						s.LogStartOffset = v
					}
					if version >= 8 {
						v := s.ErrorRecords
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]ProduceResponseTopicPartitionErrorRecord, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.RelativeOffset = v
							}
							{
								var v *string
								if isFlexible {
									if unsafe {
										v = b.UnsafeCompactNullableString()
									} else {
										v = b.CompactNullableString()
									}
								} else {
									if unsafe {
										v = b.UnsafeNullableString()
									} else {
										v = b.NullableString()
									}
								}
								s.ErrorMessage = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.ErrorRecords = v
					}
					if version >= 8 {
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						for i := b.Uvarint(); i > 0; i-- {
							switch key := b.Uvarint(); key {
							default:
								s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
							case 0:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := &s.CurrentLeader
								v.Default()
								s := v
								{
									v := b.Int32()
									s.LeaderID = v
								}
								{
									v := b.Int32()
									s.LeaderEpoch = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
								if err := b.Complete(); err != nil {
									return err
								}
							}
						}
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.Brokers
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ProduceResponseBroker, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.NodeID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					{
						v := b.Int32()
						s.Port = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Rack = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Brokers = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrProduceResponse returns a pointer to a default ProduceResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrProduceResponse() *ProduceResponse {
	var v ProduceResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ProduceResponse.
func (v *ProduceResponse) Default() {
}

// NewProduceResponse returns a default ProduceResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewProduceResponse() ProduceResponse {
	var v ProduceResponse
	v.Default()
	return v
}

type FetchRequestReplicaState struct {
	// The replica ID of the follower, or -1 if this request is from a consumer.
	//
	// This field has a default of -1.
	ID int32

	// The epoch of this follower, or -1 if not available.
	//
	// This field has a default of -1.
	Epoch int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchRequestReplicaState.
func (v *FetchRequestReplicaState) Default() {
	v.ID = -1
	v.Epoch = -1
}

// NewFetchRequestReplicaState returns a default FetchRequestReplicaState
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchRequestReplicaState() FetchRequestReplicaState {
	var v FetchRequestReplicaState
	v.Default()
	return v
}

type FetchRequestTopicPartition struct {
	// Partition is a partition in a topic to try to fetch records for.
	Partition int32

	// CurrentLeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0,
	// allows brokers to check if the client is fenced (has an out of date
	// leader) or is using an unknown leader.
	//
	// The initial leader epoch can be determined from a MetadataResponse.
	// To skip log truncation checking, use -1.
	//
	// This field has a default of -1.
	CurrentLeaderEpoch int32 // v9+

	// FetchOffset is the offset to begin the fetch from. Kafka will
	// return records at and after this offset.
	FetchOffset int64

	// The epoch of the last fetched record, or -1 if there is none.
	//
	// This field has a default of -1.
	LastFetchedEpoch int32 // v12+

	// LogStartOffset is a broker-follower only field added for KIP-107.
	// This is the start offset of the partition in a follower.
	//
	// This field has a default of -1.
	LogStartOffset int64 // v5+

	// PartitionMaxBytes is the maximum bytes to return for this partition.
	// This can be used to limit how many bytes an individual partition in
	// a request is allotted so that it does not dominate all of MaxBytes.
	PartitionMaxBytes int32

	// The directory ID of the follower fetching. This is not relevant for
	// clients; see KIP-853.
	ReplicaDirectoryID [16]byte // tag 0

	// The high-watermark known by the replica. -1 if the high-watermark is
	// not known and 9223372036854775807 if the feature is not supported.
	// For KIP-1166; not relevant for clients. Should not have forced a
	// version bump in the protocol...
	//
	// This field has a default of 9223372036854775807.
	HighWatermark int64 // tag 1

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchRequestTopicPartition.
func (v *FetchRequestTopicPartition) Default() {
	v.CurrentLeaderEpoch = -1
	v.LastFetchedEpoch = -1
	v.LogStartOffset = -1
	v.HighWatermark = 9223372036854775807
}

// NewFetchRequestTopicPartition returns a default FetchRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchRequestTopicPartition() FetchRequestTopicPartition {
	var v FetchRequestTopicPartition
	v.Default()
	return v
}

type FetchRequestTopic struct {
	// Topic is a topic to try to fetch records for.
	Topic string // v0-v12

	// TopicID is the uuid of the topic to fetch records for.
	TopicID [16]byte // v13+

	// Partitions contains partitions in a topic to try to fetch records for.
	Partitions []FetchRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchRequestTopic.
func (v *FetchRequestTopic) Default() {
}

// NewFetchRequestTopic returns a default FetchRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchRequestTopic() FetchRequestTopic {
	var v FetchRequestTopic
	v.Default()
	return v
}

type FetchRequestForgottenTopic struct {
	// Topic is a topic to remove from being tracked (with the partitions below).
	Topic string // v7-v12

	// TopicID is the uuid of a topic to remove from being tracked (with the
	// partitions below).
	TopicID [16]byte // v13+

	// Partitions are partitions to remove from tracking for a topic.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchRequestForgottenTopic.
func (v *FetchRequestForgottenTopic) Default() {
}

// NewFetchRequestForgottenTopic returns a default FetchRequestForgottenTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchRequestForgottenTopic() FetchRequestForgottenTopic {
	var v FetchRequestForgottenTopic
	v.Default()
	return v
}

// FetchRequest is a long-poll request of records from Kafka.
//
// Kafka 0.11.0.0 released v4 and changed the returned RecordBatches to contain
// the RecordBatch type. Prior, Kafka used the MessageSet type (and, for v0 and
// v1, Kafka used a different type).
//
// Note that starting in v3, Kafka began processing partitions in order,
// meaning the order of partitions in the fetch request is important due to
// potential size constraints.
//
// Starting in v13, topics must use UUIDs rather than their string name
// identifiers.
//
// Version 15 adds the ReplicaState which includes new field ReplicaEpoch and
// the ReplicaID, and deprecates the old ReplicaID (KIP-903).
type FetchRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The cluster ID, if known. This is used to validate metadata fetches
	// prior to broker registration.
	//
	// This field has a default of null.
	ClusterID *string // tag 0

	// ReplicaID is the broker ID of performing the fetch request. Standard
	// clients should use -1. To be a "debug" replica, use -2. The debug
	// replica can be used to fetch messages from non-leaders.
	//
	// This field has a default of -1.
	ReplicaID int32 // v0-v14

	// ReplicaState is a broker-only tag for v15+, see KIP-903 for more details.
	ReplicaState FetchRequestReplicaState // tag 1

	// MaxWaitMillis is how long to wait for MinBytes to be hit before a broker
	// responds to a fetch request.
	MaxWaitMillis int32

	// MinBytes is the minimum amount of bytes to attempt to read before a broker
	// responds to a fetch request.
	MinBytes int32

	// MaxBytes is the maximum amount of bytes to read in a fetch request. The
	// response can exceed MaxBytes if the first record in the first non-empty
	// partition is larger than MaxBytes.
	//
	// This field has a default of 0x7fffffff.
	MaxBytes int32 // v3+

	// IsolationLevel changes which messages are fetched. Follower replica ID's
	// (non-negative, non-standard-client) fetch from the end.
	//
	// Standard clients fetch from the high watermark, which corresponds to
	// IsolationLevel 0, READ_UNCOMMITTED.
	//
	// To only read committed records, use IsolationLevel 1, corresponding to
	// READ_COMMITTED.
	IsolationLevel int8 // v4+

	// SessionID is used to potentially reduce the amount of back and forth
	// data between a client and a broker. If opting in to sessions, the first
	// ID used should be 0, and thereafter (until session resets) the ID should
	// be the ID returned in the fetch response.
	//
	// Read KIP-227 for more details.
	SessionID int32 // v7+

	// SessionEpoch is the session epoch for this request if using sessions.
	//
	// Read KIP-227 for more details. Use -1 if you are not using sessions.
	//
	// This field has a default of -1.
	SessionEpoch int32 // v7+

	// Topic contains topics to try to fetch records for.
	Topics []FetchRequestTopic

	// ForgottenTopics contains topics and partitions that a fetch session
	// wants to remove from its session.
	//
	// See KIP-227 for more details.
	ForgottenTopics []FetchRequestForgottenTopic // v7+

	// Rack of the consumer making this request (see KIP-392; introduced in
	// Kafka 2.2.0).
	Rack string // v11+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

func (*FetchRequest) Key() int16                 { return 1 }
func (*FetchRequest) MaxVersion() int16          { return 18 }
func (v *FetchRequest) SetVersion(version int16) { v.Version = version }
func (v *FetchRequest) GetVersion() int16        { return v.Version }
func (v *FetchRequest) IsFlexible() bool         { return v.Version >= 12 }
func (v *FetchRequest) ResponseKind() Response {
	r := &FetchResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *FetchRequest) RequestWith(ctx context.Context, r Requestor) (*FetchResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*FetchResponse)
	return resp, err
}

func (v *FetchRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 12
	_ = isFlexible
	if version >= 0 && version <= 14 {
		v := v.ReplicaID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MaxWaitMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MinBytes
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 3 {
		v := v.MaxBytes
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 4 {
		v := v.IsolationLevel
		dst = kbin.AppendInt8(dst, v)
	}
	if version >= 7 {
		v := v.SessionID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 7 {
		v := v.SessionEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 12 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 13 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 9 {
						v := v.CurrentLeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.FetchOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 12 {
						v := v.LastFetchedEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 5 {
						v := v.LogStartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.PartitionMaxBytes
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						var toEncode []uint32
						if v.ReplicaDirectoryID != [16]byte{} {
							toEncode = append(toEncode, 0)
						}
						if v.HighWatermark != 9223372036854775807 {
							toEncode = append(toEncode, 1)
						}
						dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
						for _, tag := range toEncode {
							switch tag {
							case 0:
								{
									v := v.ReplicaDirectoryID
									dst = kbin.AppendUvarint(dst, 0)
									dst = kbin.AppendUvarint(dst, 16)
									dst = kbin.AppendUuid(dst, v)
								}
							case 1:
								{
									v := v.HighWatermark
									dst = kbin.AppendUvarint(dst, 1)
									dst = kbin.AppendUvarint(dst, 8)
									dst = kbin.AppendInt64(dst, v)
								}
							}
						}
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 7 {
		v := v.ForgottenTopics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 7 && version <= 12 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 13 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 11 {
		v := v.Rack
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if isFlexible {
		var toEncode []uint32
		if v.ClusterID != nil {
			toEncode = append(toEncode, 0)
		}
		if !reflect.DeepEqual(v.ReplicaState, (func() FetchRequestReplicaState { var v FetchRequestReplicaState; v.Default(); return v })()) {
			toEncode = append(toEncode, 1)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.ClusterID
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fClusterID:
					if isFlexible {
						dst = kbin.AppendCompactNullableString(dst, v)
					} else {
						dst = kbin.AppendNullableString(dst, v)
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fClusterID
					}
				}
			case 1:
				{
					v := v.ReplicaState
					dst = kbin.AppendUvarint(dst, 1)
					sized := false
					lenAt := len(dst)
				fReplicaState:
					{
						v := v.ID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Epoch
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fReplicaState
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FetchRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FetchRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FetchRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 12
	_ = isFlexible
	s := v
	if version >= 0 && version <= 14 {
		v := b.Int32()
		s.ReplicaID = v
	}
	{
		v := b.Int32()
		s.MaxWaitMillis = v
	}
	{
		v := b.Int32()
		s.MinBytes = v
	}
	if version >= 3 {
		v := b.Int32()
		s.MaxBytes = v
	}
	if version >= 4 {
		v := b.Int8()
		s.IsolationLevel = v
	}
	if version >= 7 {
		v := b.Int32()
		s.SessionID = v
	}
	if version >= 7 {
		v := b.Int32()
		s.SessionEpoch = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FetchRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 12 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 13 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 9 {
						v := b.Int32()
						s.CurrentLeaderEpoch = v
					}
					{
						v := b.Int64()
						s.FetchOffset = v
					}
					if version >= 12 {
						v := b.Int32()
						s.LastFetchedEpoch = v
					}
					if version >= 5 {
						v := b.Int64()
						s.LogStartOffset = v
					}
					{
						v := b.Int32()
						s.PartitionMaxBytes = v
					}
					if isFlexible {
						for i := b.Uvarint(); i > 0; i-- {
							switch key := b.Uvarint(); key {
							default:
								s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
							case 0:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := b.Uuid()
								s.ReplicaDirectoryID = v
								if err := b.Complete(); err != nil {
									return err
								}
							case 1:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := b.Int64()
								s.HighWatermark = v
								if err := b.Complete(); err != nil {
									return err
								}
							}
						}
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 7 {
		v := s.ForgottenTopics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FetchRequestForgottenTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 7 && version <= 12 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 13 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ForgottenTopics = v
	}
	if version >= 11 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Rack = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ClusterID = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 1:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := &s.ReplicaState
				v.Default()
				s := v
				{
					v := b.Int32()
					s.ID = v
				}
				{
					v := b.Int64()
					s.Epoch = v
				}
				if isFlexible {
					s.UnknownTags = internalReadTags(&b)
				}
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrFetchRequest returns a pointer to a default FetchRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFetchRequest() *FetchRequest {
	var v FetchRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchRequest.
func (v *FetchRequest) Default() {
	v.ClusterID = nil
	v.ReplicaID = -1
	{
		v := &v.ReplicaState
		_ = v
		v.ID = -1
		v.Epoch = -1
	}
	v.MaxBytes = 2147483647
	v.SessionEpoch = -1
}

// NewFetchRequest returns a default FetchRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchRequest() FetchRequest {
	var v FetchRequest
	v.Default()
	return v
}

type FetchResponseTopicPartitionDivergingEpoch struct {
	// This field has a default of -1.
	Epoch int32

	// This field has a default of -1.
	EndOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopicPartitionDivergingEpoch.
func (v *FetchResponseTopicPartitionDivergingEpoch) Default() {
	v.Epoch = -1
	v.EndOffset = -1
}

// NewFetchResponseTopicPartitionDivergingEpoch returns a default FetchResponseTopicPartitionDivergingEpoch
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopicPartitionDivergingEpoch() FetchResponseTopicPartitionDivergingEpoch {
	var v FetchResponseTopicPartitionDivergingEpoch
	v.Default()
	return v
}

type FetchResponseTopicPartitionCurrentLeader struct {
	// The ID of the current leader, or -1 if unknown.
	//
	// This field has a default of -1.
	LeaderID int32

	// The latest known leader epoch.
	//
	// This field has a default of -1.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopicPartitionCurrentLeader.
func (v *FetchResponseTopicPartitionCurrentLeader) Default() {
	v.LeaderID = -1
	v.LeaderEpoch = -1
}

// NewFetchResponseTopicPartitionCurrentLeader returns a default FetchResponseTopicPartitionCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopicPartitionCurrentLeader() FetchResponseTopicPartitionCurrentLeader {
	var v FetchResponseTopicPartitionCurrentLeader
	v.Default()
	return v
}

type FetchResponseTopicPartitionSnapshotID struct {
	// This field has a default of -1.
	EndOffset int64

	// This field has a default of -1.
	Epoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopicPartitionSnapshotID.
func (v *FetchResponseTopicPartitionSnapshotID) Default() {
	v.EndOffset = -1
	v.Epoch = -1
}

// NewFetchResponseTopicPartitionSnapshotID returns a default FetchResponseTopicPartitionSnapshotID
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopicPartitionSnapshotID() FetchResponseTopicPartitionSnapshotID {
	var v FetchResponseTopicPartitionSnapshotID
	v.Default()
	return v
}

type FetchResponseTopicPartitionAbortedTransaction struct {
	// ProducerID is the producer ID that caused this aborted transaction.
	ProducerID int64

	// FirstOffset is the offset where this aborted transaction began.
	FirstOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopicPartitionAbortedTransaction.
func (v *FetchResponseTopicPartitionAbortedTransaction) Default() {
}

// NewFetchResponseTopicPartitionAbortedTransaction returns a default FetchResponseTopicPartitionAbortedTransaction
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopicPartitionAbortedTransaction() FetchResponseTopicPartitionAbortedTransaction {
	var v FetchResponseTopicPartitionAbortedTransaction
	v.Default()
	return v
}

type FetchResponseTopicPartition struct {
	// Partition is a partition in a topic that records may have been
	// received for.
	Partition int32

	// ErrorCode is an error returned for an individual partition in a
	// fetch request.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to read the partition.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the topic or partition
	// does not exist on this broker.
	//
	// UNSUPPORTED_COMPRESSION_TYPE is returned if the request version was
	// under 10 and the batch is compressed with zstd.
	//
	// UNSUPPORTED_VERSION is returned if the broker has records newer than
	// the client can support (magic value) and the broker has disabled
	// message downconversion.
	//
	// NOT_LEADER_FOR_PARTITION is returned if requesting data for this
	// partition as a follower (non-negative ReplicaID) and the broker
	// is not the leader for this partition.
	//
	// REPLICA_NOT_AVAILABLE is returned if the partition exists but
	// the requested broker is not the leader for it.
	//
	// KAFKA_STORAGE_EXCEPTION is returned if the requested partition is
	// offline.
	//
	// UNKNOWN_LEADER_EPOCH is returned if the request used a larger leader
	// epoch than the broker knows of.
	//
	// FENCED_LEADER_EPOCH is returned if the request used a smaller leader
	// epoch than the broker is at (see KIP-320).
	//
	// OFFSET_OUT_OF_RANGE is returned if requesting an offset past the
	// current end offset or before the beginning offset.
	//
	// UNKNOWN_TOPIC_ID is returned if using uuid's and the uuid is unknown
	// (v13+ / Kafka 3.1+).
	//
	// OFFSET_MOVED_TO_TIERED_STORAGE is returned if a follower is trying to
	// fetch from an offset that is now in tiered storage.
	ErrorCode int16

	// HighWatermark is the current high watermark for this partition,
	// that is, the current offset that is on all in sync replicas.
	HighWatermark int64

	// LastStableOffset is the offset at which all prior offsets have
	// been "decided". Non transactional records are always decided
	// immediately, but transactional records are only decided once
	// they are committed or aborted.
	//
	// The LastStableOffset will always be at or under the HighWatermark.
	//
	// This field has a default of -1.
	LastStableOffset int64 // v4+

	// LogStartOffset is the beginning offset for this partition.
	// This field was added for KIP-107.
	//
	// This field has a default of -1.
	LogStartOffset int64 // v5+

	// In case divergence is detected based on the LastFetchedEpoch and
	// FetchOffset in the request, this field indicates the largest epoch and
	// its end offset such that subsequent records are known to diverge.
	DivergingEpoch FetchResponseTopicPartitionDivergingEpoch // tag 0

	// CurrentLeader is the currently known leader ID and epoch for this
	// partition.
	CurrentLeader FetchResponseTopicPartitionCurrentLeader // tag 1

	// In the case of fetching an offset less than the LogStartOffset, this
	// is the end offset and epoch that should be used in the FetchSnapshot
	// request.
	SnapshotID FetchResponseTopicPartitionSnapshotID // tag 2

	// AbortedTransactions is an array of aborted transactions within the
	// returned offset range. This is only returned if the requested
	// isolation level was READ_COMMITTED.
	AbortedTransactions []FetchResponseTopicPartitionAbortedTransaction // v4+

	// PreferredReadReplica is the preferred replica for the consumer
	// to use on its next fetch request. See KIP-392.
	//
	// This field has a default of -1.
	PreferredReadReplica int32 // v11+

	// RecordBatches is an array of record batches for a topic partition.
	//
	// This is encoded as a raw byte array, with the standard int32 size
	// prefix. One important catch to note is that the final element of the
	// array may be **partial**. This is an optimization in Kafka that
	// clients must deal with by discarding a partial trailing batch.
	//
	// Starting v2, this transitioned to the MessageSet v1 format (and this
	// would contain many MessageV1 structs).
	//
	// Starting v4, this transitioned to the RecordBatch format (thus this
	// contains many RecordBatch structs).
	RecordBatches []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopicPartition.
func (v *FetchResponseTopicPartition) Default() {
	v.LastStableOffset = -1
	v.LogStartOffset = -1
	{
		v := &v.DivergingEpoch
		_ = v
		v.Epoch = -1
		v.EndOffset = -1
	}
	{
		v := &v.CurrentLeader
		_ = v
		v.LeaderID = -1
		v.LeaderEpoch = -1
	}
	{
		v := &v.SnapshotID
		_ = v
		v.EndOffset = -1
		v.Epoch = -1
	}
	v.PreferredReadReplica = -1
}

// NewFetchResponseTopicPartition returns a default FetchResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopicPartition() FetchResponseTopicPartition {
	var v FetchResponseTopicPartition
	v.Default()
	return v
}

type FetchResponseTopic struct {
	// Topic is a topic that records may have been received for.
	Topic string // v0-v12

	// TopicID is the uuid of a topic that records may have been received for.
	TopicID [16]byte // v13+

	// Partitions contains partitions in a topic that records may have
	// been received for.
	Partitions []FetchResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseTopic.
func (v *FetchResponseTopic) Default() {
}

// NewFetchResponseTopic returns a default FetchResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseTopic() FetchResponseTopic {
	var v FetchResponseTopic
	v.Default()
	return v
}

type FetchResponseBroker struct {
	// NodeID is the node ID of a Kafka broker.
	NodeID int32

	// Host is the hostname of a Kafka broker.
	Host string

	// Port is the port of a Kafka broker.
	Port int32

	// Rack is the rack this Kafka broker is in.
	Rack *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponseBroker.
func (v *FetchResponseBroker) Default() {
}

// NewFetchResponseBroker returns a default FetchResponseBroker
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponseBroker() FetchResponseBroker {
	var v FetchResponseBroker
	v.Default()
	return v
}

// FetchResponse is returned from a FetchRequest.
type FetchResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 8.
	ThrottleMillis int32 // v1+

	// ErrorCode is a full-response error code for a fetch request. This was
	// added in support of KIP-227. This error is only non-zero if using fetch
	// sessions.
	//
	// FETCH_SESSION_ID_NOT_FOUND is returned if the request used a
	// session ID that the broker does not know of.
	//
	// INVALID_FETCH_SESSION_EPOCH is returned if the request used an
	// invalid session epoch.
	ErrorCode int16 // v7+

	// SessionID is the id for this session if using sessions.
	//
	// See KIP-227 for more details.
	SessionID int32 // v7+

	// Topics contains an array of topic partitions and the records received
	// for them.
	Topics []FetchResponseTopic

	// Brokers is present if any partition responses contain the error
	// NOT_LEADER_OR_FOLLOWER.
	Brokers []FetchResponseBroker // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v12+
}

func (*FetchResponse) Key() int16                         { return 1 }
func (*FetchResponse) MaxVersion() int16                  { return 18 }
func (v *FetchResponse) SetVersion(version int16)         { v.Version = version }
func (v *FetchResponse) GetVersion() int16                { return v.Version }
func (v *FetchResponse) IsFlexible() bool                 { return v.Version >= 12 }
func (v *FetchResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 8 }
func (v *FetchResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *FetchResponse) RequestKind() Request             { return &FetchRequest{Version: v.Version} }

func (v *FetchResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 12
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 7 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 7 {
		v := v.SessionID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 12 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 13 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.HighWatermark
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 4 {
						v := v.LastStableOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 5 {
						v := v.LogStartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 4 {
						v := v.AbortedTransactions
						if isFlexible {
							dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
						} else {
							dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
						}
						for i := range v {
							v := &v[i]
							{
								v := v.ProducerID
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if version >= 11 {
						v := v.PreferredReadReplica
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.RecordBatches
						if isFlexible {
							dst = kbin.AppendCompactNullableBytes(dst, v)
						} else {
							dst = kbin.AppendNullableBytes(dst, v)
						}
					}
					if isFlexible {
						var toEncode []uint32
						if !reflect.DeepEqual(v.DivergingEpoch, (func() FetchResponseTopicPartitionDivergingEpoch {
							var v FetchResponseTopicPartitionDivergingEpoch
							v.Default()
							return v
						})()) {
							toEncode = append(toEncode, 0)
						}
						if !reflect.DeepEqual(v.CurrentLeader, (func() FetchResponseTopicPartitionCurrentLeader {
							var v FetchResponseTopicPartitionCurrentLeader
							v.Default()
							return v
						})()) {
							toEncode = append(toEncode, 1)
						}
						if !reflect.DeepEqual(v.SnapshotID, (func() FetchResponseTopicPartitionSnapshotID {
							var v FetchResponseTopicPartitionSnapshotID
							v.Default()
							return v
						})()) {
							toEncode = append(toEncode, 2)
						}
						dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
						for _, tag := range toEncode {
							switch tag {
							case 0:
								{
									v := v.DivergingEpoch
									dst = kbin.AppendUvarint(dst, 0)
									sized := false
									lenAt := len(dst)
								fDivergingEpoch:
									{
										v := v.Epoch
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.EndOffset
										dst = kbin.AppendInt64(dst, v)
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
									if !sized {
										dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
										sized = true
										goto fDivergingEpoch
									}
								}
							case 1:
								{
									v := v.CurrentLeader
									dst = kbin.AppendUvarint(dst, 1)
									sized := false
									lenAt := len(dst)
								fCurrentLeader:
									{
										v := v.LeaderID
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.LeaderEpoch
										dst = kbin.AppendInt32(dst, v)
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
									if !sized {
										dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
										sized = true
										goto fCurrentLeader
									}
								}
							case 2:
								{
									v := v.SnapshotID
									dst = kbin.AppendUvarint(dst, 2)
									sized := false
									lenAt := len(dst)
								fSnapshotID:
									{
										v := v.EndOffset
										dst = kbin.AppendInt64(dst, v)
									}
									{
										v := v.Epoch
										dst = kbin.AppendInt32(dst, v)
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
									if !sized {
										dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
										sized = true
										goto fSnapshotID
									}
								}
							}
						}
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.Brokers) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.Brokers
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fBrokers:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						{
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						{
							v := v.Port
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.Rack
							if isFlexible {
								dst = kbin.AppendCompactNullableString(dst, v)
							} else {
								dst = kbin.AppendNullableString(dst, v)
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fBrokers
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FetchResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FetchResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FetchResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 12
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 7 {
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 7 {
		v := b.Int32()
		s.SessionID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FetchResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 12 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 13 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int64()
						s.HighWatermark = v
					}
					if version >= 4 {
						v := b.Int64()
						s.LastStableOffset = v
					}
					if version >= 5 {
						v := b.Int64()
						s.LogStartOffset = v
					}
					if version >= 4 {
						v := s.AbortedTransactions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if version < 0 || l == 0 {
							a = []FetchResponseTopicPartitionAbortedTransaction{}
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]FetchResponseTopicPartitionAbortedTransaction, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.ProducerID = v
							}
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.AbortedTransactions = v
					}
					if version >= 11 {
						v := b.Int32()
						s.PreferredReadReplica = v
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactNullableBytes()
						} else {
							v = b.NullableBytes()
						}
						s.RecordBatches = v
					}
					if isFlexible {
						for i := b.Uvarint(); i > 0; i-- {
							switch key := b.Uvarint(); key {
							default:
								s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
							case 0:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := &s.DivergingEpoch
								v.Default()
								s := v
								{
									v := b.Int32()
									s.Epoch = v
								}
								{
									v := b.Int64()
									s.EndOffset = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
								if err := b.Complete(); err != nil {
									return err
								}
							case 1:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := &s.CurrentLeader
								v.Default()
								s := v
								{
									v := b.Int32()
									s.LeaderID = v
								}
								{
									v := b.Int32()
									s.LeaderEpoch = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
								if err := b.Complete(); err != nil {
									return err
								}
							case 2:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := &s.SnapshotID
								v.Default()
								s := v
								{
									v := b.Int64()
									s.EndOffset = v
								}
								{
									v := b.Int32()
									s.Epoch = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
								if err := b.Complete(); err != nil {
									return err
								}
							}
						}
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.Brokers
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchResponseBroker, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.NodeID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					{
						v := b.Int32()
						s.Port = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Rack = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Brokers = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrFetchResponse returns a pointer to a default FetchResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFetchResponse() *FetchResponse {
	var v FetchResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchResponse.
func (v *FetchResponse) Default() {
}

// NewFetchResponse returns a default FetchResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchResponse() FetchResponse {
	var v FetchResponse
	v.Default()
	return v
}

type ListOffsetsRequestTopicPartition struct {
	// Partition is a partition of a topic to get offsets for.
	Partition int32

	// CurrentLeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0,
	// allows brokers to check if the client is fenced (has an out of date
	// leader) or is using an unknown leader.
	//
	// The initial leader epoch can be determined from a MetadataResponse.
	// To skip log truncation checking, use -1.
	//
	// This field has a default of -1.
	CurrentLeaderEpoch int32 // v4+

	// Timestamp controls which offset to return in a response for this
	// partition.
	//
	// The offset returned will be the one of the message whose timestamp is
	// the first timestamp greater than or equal to this requested timestamp.
	//
	// If no such message is found, then no offset is returned (-1).
	//
	// There exist two special timestamps: -2 corresponds to the earliest
	// timestamp, and -1 corresponds to the latest.
	//
	// If you are talking to Kafka 3.0+, there exists an additional special
	// timestamp -3 that returns the latest timestamp produced so far and its
	// corresponding offset. This is subtly different from the latest offset,
	// because timestamps are client-side generated. More importantly though,
	// because this returns the latest produced timestamp, this can be used
	// to determine topic "liveness" (when was the last produce?).
	// Previously, this was not easy to determine. See KIP-734 for more
	// detail.
	//
	// If you are talking to Kafka 3.4+ and using request version 8+ (for
	// KIP-405), the new special timestamp -4 returns the local log start
	// offset. In the context of tiered storage, the earliest local log start
	// offset is the offset actually available on disk on the broker.
	//
	// If you are talking to Kafka 3.9+ and using request version 9+ (for KIP-1005),
	// the special timestamp -5 returns the latest offset in remote storage.
	Timestamp int64

	// MaxNumOffsets is the maximum number of offsets to report.
	// This was removed after v0.
	//
	// This field has a default of 1.
	MaxNumOffsets int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsRequestTopicPartition.
func (v *ListOffsetsRequestTopicPartition) Default() {
	v.CurrentLeaderEpoch = -1
	v.MaxNumOffsets = 1
}

// NewListOffsetsRequestTopicPartition returns a default ListOffsetsRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsRequestTopicPartition() ListOffsetsRequestTopicPartition {
	var v ListOffsetsRequestTopicPartition
	v.Default()
	return v
}

type ListOffsetsRequestTopic struct {
	// Topic is a topic to get offsets for.
	Topic string

	// Partitions is an array of partitions in a topic to get offsets for.
	Partitions []ListOffsetsRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsRequestTopic.
func (v *ListOffsetsRequestTopic) Default() {
}

// NewListOffsetsRequestTopic returns a default ListOffsetsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsRequestTopic() ListOffsetsRequestTopic {
	var v ListOffsetsRequestTopic
	v.Default()
	return v
}

// ListOffsetsRequest requests partition offsets from Kafka for use in
// consuming records.
//
// Version 5, introduced in Kafka 2.2.0, is the same as version 4. Using
// version 5 implies you support Kafka's OffsetNotAvailableException
// See KIP-207 for details.
//
// Version 7, introduced in Kafka 3.0, supports -3 as a timestamp to return
// the timestamp and offset for the record with the largest timestamp.
//
// Version 8, introduced in Kafka 3.4, supports -4 as a timestamp to return
// the local log start offset (in the context of tiered storage, see KIP-405).
//
// Version 9, introduced in Kafka 3.9, supports -5 as a timestamp to return
// the latest offset in remote storage. See KIP-1005.
//
// Version 10, introduced in Kafka 4.0, adds TimeoutMillis, allowing you to set
// a timeout when the ListOffsets request triggers a lookup from remote storage.
// See KIP-1075.
//
// Version 11, introduced in Kafka 4.2, supports -6 as a timestamp to return
// the earliest pending upload offset. See KIP-1023.
type ListOffsetsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ReplicaID is the broker ID to get offsets from. As a Kafka client, use -1.
	// The consumer replica ID (-1) causes requests to only succeed if issued
	// against the leader broker.
	//
	// This field has a default of -1.
	ReplicaID int32

	// IsolationLevel configures which record offsets are visible in the
	// response. READ_UNCOMMITTED (0) makes all records visible. READ_COMMITTED
	// (1) makes non-transactional and committed transactional records visible.
	// READ_COMMITTED means all offsets smaller than the last stable offset and
	// includes aborted transactions (allowing consumers to discard aborted
	// records).
	IsolationLevel int8 // v2+

	// Topics is an array of topics to get offsets for.
	Topics []ListOffsetsRequestTopic

	// TimeoutMillis is how long to wait for a lookup the offset being looked up
	// is in remote storage.
	//
	// This field has a default of 30000.
	TimeoutMillis int32 // v10+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*ListOffsetsRequest) Key() int16                 { return 2 }
func (*ListOffsetsRequest) MaxVersion() int16          { return 11 }
func (v *ListOffsetsRequest) SetVersion(version int16) { v.Version = version }
func (v *ListOffsetsRequest) GetVersion() int16        { return v.Version }
func (v *ListOffsetsRequest) IsFlexible() bool         { return v.Version >= 6 }
func (v *ListOffsetsRequest) ResponseKind() Response {
	r := &ListOffsetsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ListOffsetsRequest) RequestWith(ctx context.Context, r Requestor) (*ListOffsetsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ListOffsetsResponse)
	return resp, err
}

func (v *ListOffsetsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	{
		v := v.ReplicaID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 2 {
		v := v.IsolationLevel
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 4 {
						v := v.CurrentLeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Timestamp
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 0 && version <= 0 {
						v := v.MaxNumOffsets
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 10 {
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListOffsetsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListOffsetsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListOffsetsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ReplicaID = v
	}
	if version >= 2 {
		v := b.Int8()
		s.IsolationLevel = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListOffsetsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ListOffsetsRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 4 {
						v := b.Int32()
						s.CurrentLeaderEpoch = v
					}
					{
						v := b.Int64()
						s.Timestamp = v
					}
					if version >= 0 && version <= 0 {
						v := b.Int32()
						s.MaxNumOffsets = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 10 {
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListOffsetsRequest returns a pointer to a default ListOffsetsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListOffsetsRequest() *ListOffsetsRequest {
	var v ListOffsetsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsRequest.
func (v *ListOffsetsRequest) Default() {
	v.ReplicaID = -1
	v.TimeoutMillis = 30000
}

// NewListOffsetsRequest returns a default ListOffsetsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsRequest() ListOffsetsRequest {
	var v ListOffsetsRequest
	v.Default()
	return v
}

type ListOffsetsResponseTopicPartition struct {
	// Partition is the partition this array slot is for.
	Partition int32

	// ErrorCode is any error for a topic partition in a ListOffsets request.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to describe the topic.
	//
	// INVALID_REQUEST is returned if the requested topic partitions had
	// contained duplicates.
	//
	// KAFKA_STORAGE_EXCEPTION is returned if the topic / partition is in
	// an offline log directory.
	//
	// UNSUPPORTED_FOR_MESSAGE_FORMAT is returned if the broker is using
	// Kafka 0.10.0 messages and the requested timestamp was not -1 nor -2.
	//
	// NOT_LEADER_FOR_PARTITION is returned if the broker is not a leader
	// for this partition. This means that the client has stale metadata.
	// If the request used the debug replica ID, the returned error will
	// be REPLICA_NOT_AVAILABLE.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know
	// of the requested topic or partition.
	//
	// FENCED_LEADER_EPOCH is returned if the broker has a higher leader
	// epoch than what the request sent.
	//
	// UNKNOWN_LEADER_EPOCH is returned if the request used a leader epoch
	// that the broker does not know about.
	//
	// OFFSET_NOT_AVAILABLE, introduced in Kafka 2.2.0 with produce request
	// v5+, is returned when talking to a broker that is a new leader while
	// that broker's high water mark catches up. This avoids situations where
	// the old broker returned higher offsets than the new broker would. Note
	// that if unclean leader election is allowed, you could still run into
	// the situation where offsets returned from list offsets requests are
	// not monotonically increasing. This error is only returned if the
	// request used the consumer replica ID (-1). If the client did not use
	// a v5+ list offsets request, LEADER_NOT_AVAILABLE is returned.
	// See KIP-207 for more details.
	ErrorCode int16

	// OldStyleOffsets is a list of offsets. This was removed after
	// version 0 and, since it is so historic, is undocumented.
	OldStyleOffsets []int64

	// If the request was for the earliest or latest timestamp (-2 or -1), or
	// if an offset could not be found after the requested one, this will be -1.
	//
	// This field has a default of -1.
	Timestamp int64 // v1+

	// Offset is the offset corresponding to the record on or after the
	// requested timestamp. If one could not be found, this will be -1.
	//
	// This field has a default of -1.
	Offset int64 // v1+

	// LeaderEpoch is the leader epoch of the record at this offset,
	// or -1 if there was no leader epoch.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsResponseTopicPartition.
func (v *ListOffsetsResponseTopicPartition) Default() {
	v.Timestamp = -1
	v.Offset = -1
	v.LeaderEpoch = -1
}

// NewListOffsetsResponseTopicPartition returns a default ListOffsetsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsResponseTopicPartition() ListOffsetsResponseTopicPartition {
	var v ListOffsetsResponseTopicPartition
	v.Default()
	return v
}

type ListOffsetsResponseTopic struct {
	// Topic is the topic this array slot is for.
	Topic string

	// Partitions is an array of partition responses corresponding to
	// the requested partitions for a topic.
	Partitions []ListOffsetsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsResponseTopic.
func (v *ListOffsetsResponseTopic) Default() {
}

// NewListOffsetsResponseTopic returns a default ListOffsetsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsResponseTopic() ListOffsetsResponseTopic {
	var v ListOffsetsResponseTopic
	v.Default()
	return v
}

// ListOffsetsResponse is returned from a ListOffsetsRequest.
type ListOffsetsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 3.
	ThrottleMillis int32 // v2+

	// Topics is an array of topic / partition responses corresponding to
	// the requested topics and partitions.
	Topics []ListOffsetsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*ListOffsetsResponse) Key() int16                         { return 2 }
func (*ListOffsetsResponse) MaxVersion() int16                  { return 11 }
func (v *ListOffsetsResponse) SetVersion(version int16)         { v.Version = version }
func (v *ListOffsetsResponse) GetVersion() int16                { return v.Version }
func (v *ListOffsetsResponse) IsFlexible() bool                 { return v.Version >= 6 }
func (v *ListOffsetsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 3 }
func (v *ListOffsetsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ListOffsetsResponse) RequestKind() Request             { return &ListOffsetsRequest{Version: v.Version} }

func (v *ListOffsetsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	if version >= 2 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if version >= 0 && version <= 0 {
						v := v.OldStyleOffsets
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt64(dst, v)
						}
					}
					if version >= 1 {
						v := v.Timestamp
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 1 {
						v := v.Offset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 4 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListOffsetsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListOffsetsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListOffsetsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	if version >= 2 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListOffsetsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ListOffsetsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if version >= 0 && version <= 0 {
						v := s.OldStyleOffsets
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int64, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int64()
							a[i] = v
						}
						v = a
						s.OldStyleOffsets = v
					}
					if version >= 1 {
						v := b.Int64()
						s.Timestamp = v
					}
					if version >= 1 {
						v := b.Int64()
						s.Offset = v
					}
					if version >= 4 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListOffsetsResponse returns a pointer to a default ListOffsetsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListOffsetsResponse() *ListOffsetsResponse {
	var v ListOffsetsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListOffsetsResponse.
func (v *ListOffsetsResponse) Default() {
}

// NewListOffsetsResponse returns a default ListOffsetsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewListOffsetsResponse() ListOffsetsResponse {
	var v ListOffsetsResponse
	v.Default()
	return v
}

type MetadataRequestTopic struct {
	// The topic ID. Only one of either topic ID or topic name should be used.
	// If using the topic name, this should just be the default empty value.
	TopicID [16]byte // v10+

	// Topic is the topic to request metadata for. Version 10 switched this
	// from a string to a nullable string; if using a topic ID, this field
	// should be null.
	Topic *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataRequestTopic.
func (v *MetadataRequestTopic) Default() {
}

// NewMetadataRequestTopic returns a default MetadataRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataRequestTopic() MetadataRequestTopic {
	var v MetadataRequestTopic
	v.Default()
	return v
}

// MetadataRequest requests metadata from Kafka.
type MetadataRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics is a list of topics to return metadata about. If this is null
	// in v1+, all topics are included. If this is empty, no topics are.
	// For v0 (<Kafka 0.10.0.0), if this is empty, all topics are included.
	Topics []MetadataRequestTopic

	// AllowAutoTopicCreation, introduced in Kafka 0.11.0.0, allows topic
	// auto creation of the topics in this request if they do not exist.
	AllowAutoTopicCreation bool // v4+

	// IncludeClusterAuthorizedOperations, introduced in Kakfa 2.3.0, specifies
	// whether to return a bitfield of AclOperations that this client can perform
	// on the cluster. See KIP-430 for more details.
	//
	// This field was removed in Kafka 2.8.0 in favor of the new DescribeClusterRequest.
	IncludeClusterAuthorizedOperations bool // v8-v10

	// IncludeTopicAuthorizedOperations, introduced in Kakfa 2.3.0, specifies
	// whether to return a bitfield of AclOperations that this client can perform
	// on individual topics. See KIP-430 for more details.
	IncludeTopicAuthorizedOperations bool // v8+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

func (*MetadataRequest) Key() int16                 { return 3 }
func (*MetadataRequest) MaxVersion() int16          { return 13 }
func (v *MetadataRequest) SetVersion(version int16) { v.Version = version }
func (v *MetadataRequest) GetVersion() int16        { return v.Version }
func (v *MetadataRequest) IsFlexible() bool         { return v.Version >= 9 }
func (v *MetadataRequest) ResponseKind() Response {
	r := &MetadataResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *MetadataRequest) RequestWith(ctx context.Context, r Requestor) (*MetadataResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*MetadataResponse)
	return resp, err
}

func (v *MetadataRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	{
		v := v.Topics
		if version >= 1 {
			if isFlexible {
				dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
			} else {
				dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
			}
		} else {
			if isFlexible {
				dst = kbin.AppendCompactArrayLen(dst, len(v))
			} else {
				dst = kbin.AppendArrayLen(dst, len(v))
			}
		}
		for i := range v {
			v := &v[i]
			if version >= 10 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Topic
				if version < 10 {
					var vv string
					if v != nil {
						vv = *v
					}
					{
						v := vv
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
				} else {
					if isFlexible {
						dst = kbin.AppendCompactNullableString(dst, v)
					} else {
						dst = kbin.AppendNullableString(dst, v)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 4 {
		v := v.AllowAutoTopicCreation
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 8 && version <= 10 {
		v := v.IncludeClusterAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 8 {
		v := v.IncludeTopicAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *MetadataRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *MetadataRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *MetadataRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 1 || l == 0 {
			a = []MetadataRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]MetadataRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 10 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				var v *string
				if version < 10 {
					var vv string
					if isFlexible {
						if unsafe {
							vv = b.UnsafeCompactString()
						} else {
							vv = b.CompactString()
						}
					} else {
						if unsafe {
							vv = b.UnsafeString()
						} else {
							vv = b.String()
						}
					}
					v = &vv
				} else {
					if isFlexible {
						if unsafe {
							v = b.UnsafeCompactNullableString()
						} else {
							v = b.CompactNullableString()
						}
					} else {
						if unsafe {
							v = b.UnsafeNullableString()
						} else {
							v = b.NullableString()
						}
					}
				}
				s.Topic = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 4 {
		v := b.Bool()
		s.AllowAutoTopicCreation = v
	}
	if version >= 8 && version <= 10 {
		v := b.Bool()
		s.IncludeClusterAuthorizedOperations = v
	}
	if version >= 8 {
		v := b.Bool()
		s.IncludeTopicAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrMetadataRequest returns a pointer to a default MetadataRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrMetadataRequest() *MetadataRequest {
	var v MetadataRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataRequest.
func (v *MetadataRequest) Default() {
}

// NewMetadataRequest returns a default MetadataRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataRequest() MetadataRequest {
	var v MetadataRequest
	v.Default()
	return v
}

type MetadataResponseBroker struct {
	// NodeID is the node ID of a Kafka broker.
	NodeID int32

	// Host is the hostname of a Kafka broker.
	Host string

	// Port is the port of a Kafka broker.
	Port int32

	// Rack is the rack this Kafka broker is in.
	Rack *string // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataResponseBroker.
func (v *MetadataResponseBroker) Default() {
}

// NewMetadataResponseBroker returns a default MetadataResponseBroker
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataResponseBroker() MetadataResponseBroker {
	var v MetadataResponseBroker
	v.Default()
	return v
}

type MetadataResponseTopicPartition struct {
	// ErrorCode is any error for a partition in topic metadata.
	//
	// LEADER_NOT_AVAILABLE is returned if a leader is unavailable for this
	// partition. For v0 metadata responses, this is also returned if a
	// partition leader's listener does not exist.
	//
	// LISTENER_NOT_FOUND is returned if a leader ID is known but the
	// listener for it is not (v1+).
	//
	// REPLICA_NOT_AVAILABLE is returned in v0 responses if any replica is
	// unavailable.
	//
	// UNKNOWN_TOPIC_ID is returned if using a topic ID and the ID does not
	// exist.
	ErrorCode int16

	// Partition is a partition number for a topic.
	Partition int32

	// Leader is the broker leader for this partition. This will be -1
	// on leader / listener error.
	Leader int32

	// LeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0 is the
	// epoch of the broker leader.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v7+

	// Replicas returns all broker IDs containing replicas of this partition.
	Replicas []int32

	// ISR returns all broker IDs of in-sync replicas of this partition.
	ISR []int32

	// OfflineReplicas, proposed in KIP-112 and introduced in Kafka 1.0,
	// returns all offline broker IDs that should be replicating this partition.
	OfflineReplicas []int32 // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataResponseTopicPartition.
func (v *MetadataResponseTopicPartition) Default() {
	v.LeaderEpoch = -1
}

// NewMetadataResponseTopicPartition returns a default MetadataResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataResponseTopicPartition() MetadataResponseTopicPartition {
	var v MetadataResponseTopicPartition
	v.Default()
	return v
}

type MetadataResponseTopic struct {
	// ErrorCode is any error for a topic in a metadata request.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to describe the topic, or if the metadata request specified topic auto
	// creation, the topic did not exist, and the user lacks permission to create.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if a topic does not exist and
	// the request did not specify autocreation.
	//
	// LEADER_NOT_AVAILABLE is returned if a new topic is created successfully
	// (since there is no leader on an immediately new topic).
	//
	// There can be a myriad of other errors for unsuccessful topic creation.
	ErrorCode int16

	// Topic is the topic this metadata corresponds to.
	Topic *string

	// The topic ID.
	TopicID [16]byte // v10+

	// IsInternal signifies whether this topic is a Kafka internal topic.
	IsInternal bool // v1+

	// Partitions contains metadata about partitions for a topic.
	Partitions []MetadataResponseTopicPartition

	// AuthorizedOperations, proposed in KIP-430 and introduced in Kafka 2.3.0,
	// is a bitfield (corresponding to AclOperation) containing which operations
	// the client is allowed to perform on this topic.
	// This is only returned if requested.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32 // v8+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataResponseTopic.
func (v *MetadataResponseTopic) Default() {
	v.AuthorizedOperations = -2147483648
}

// NewMetadataResponseTopic returns a default MetadataResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataResponseTopic() MetadataResponseTopic {
	var v MetadataResponseTopic
	v.Default()
	return v
}

// MetadataResponse is returned from a MetdataRequest.
type MetadataResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 6.
	ThrottleMillis int32 // v3+

	// Brokers is a set of alive Kafka brokers.
	Brokers []MetadataResponseBroker

	// ClusterID, proposed in KIP-78 and introduced in Kafka 0.10.1.0, is a
	// unique string specifying the cluster that the replying Kafka belongs to.
	ClusterID *string // v2+

	// ControllerID is the ID of the controller broker (the admin broker).
	//
	// This field has a default of -1.
	ControllerID int32 // v1+

	// Topics contains metadata about each topic requested in the
	// MetadataRequest.
	Topics []MetadataResponseTopic

	// AuthorizedOperations is a bitfield containing which operations the client
	// is allowed to perform on this cluster.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32 // v8-v10

	// ErrorCode indicates any error. Kafka 4.0 introduced this via KIP-1102
	// to signal to clients that rebootstrapping is required.
	ErrorCode int16 // v13+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v9+
}

func (*MetadataResponse) Key() int16                         { return 3 }
func (*MetadataResponse) MaxVersion() int16                  { return 13 }
func (v *MetadataResponse) SetVersion(version int16)         { v.Version = version }
func (v *MetadataResponse) GetVersion() int16                { return v.Version }
func (v *MetadataResponse) IsFlexible() bool                 { return v.Version >= 9 }
func (v *MetadataResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 6 }
func (v *MetadataResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *MetadataResponse) RequestKind() Request             { return &MetadataRequest{Version: v.Version} }

func (v *MetadataResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	if version >= 3 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Brokers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 1 {
				v := v.Rack
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 2 {
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.Topic
				if version < 12 {
					var vv string
					if v != nil {
						vv = *v
					}
					{
						v := vv
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
				} else {
					if isFlexible {
						dst = kbin.AppendCompactNullableString(dst, v)
					} else {
						dst = kbin.AppendNullableString(dst, v)
					}
				}
			}
			if version >= 10 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			if version >= 1 {
				v := v.IsInternal
				dst = kbin.AppendBool(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Leader
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 7 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.ISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 5 {
						v := v.OfflineReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if version >= 8 {
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 8 && version <= 10 {
		v := v.AuthorizedOperations
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 13 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *MetadataResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *MetadataResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *MetadataResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 9
	_ = isFlexible
	s := v
	if version >= 3 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Brokers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]MetadataResponseBroker, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			if version >= 1 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Rack = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Brokers = v
	}
	if version >= 2 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	if version >= 1 {
		v := b.Int32()
		s.ControllerID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]MetadataResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if version < 12 {
					var vv string
					if isFlexible {
						if unsafe {
							vv = b.UnsafeCompactString()
						} else {
							vv = b.CompactString()
						}
					} else {
						if unsafe {
							vv = b.UnsafeString()
						} else {
							vv = b.String()
						}
					}
					v = &vv
				} else {
					if isFlexible {
						if unsafe {
							v = b.UnsafeCompactNullableString()
						} else {
							v = b.CompactNullableString()
						}
					} else {
						if unsafe {
							v = b.UnsafeNullableString()
						} else {
							v = b.NullableString()
						}
					}
				}
				s.Topic = v
			}
			if version >= 10 {
				v := b.Uuid()
				s.TopicID = v
			}
			if version >= 1 {
				v := b.Bool()
				s.IsInternal = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]MetadataResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.Leader = v
					}
					if version >= 7 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					{
						v := s.ISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.ISR = v
					}
					if version >= 5 {
						v := s.OfflineReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.OfflineReplicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if version >= 8 {
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 8 && version <= 10 {
		v := b.Int32()
		s.AuthorizedOperations = v
	}
	if version >= 13 {
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrMetadataResponse returns a pointer to a default MetadataResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrMetadataResponse() *MetadataResponse {
	var v MetadataResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to MetadataResponse.
func (v *MetadataResponse) Default() {
	v.ControllerID = -1
	v.AuthorizedOperations = -2147483648
}

// NewMetadataResponse returns a default MetadataResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewMetadataResponse() MetadataResponse {
	var v MetadataResponse
	v.Default()
	return v
}

// LeaderAndISRRequestTopicPartition is a common struct that is used across
// different versions of LeaderAndISRRequest.
type LeaderAndISRRequestTopicPartition struct {
	Topic string // v0-v1

	Partition int32

	ControllerEpoch int32

	Leader int32

	LeaderEpoch int32

	ISR []int32

	ZKVersion int32

	Replicas []int32

	AddingReplicas []int32 // v3+

	RemovingReplicas []int32 // v3+

	IsNew bool // v1+

	LeaderRecoveryState int8 // v6+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRRequestTopicPartition.
func (v *LeaderAndISRRequestTopicPartition) Default() {
}

// NewLeaderAndISRRequestTopicPartition returns a default LeaderAndISRRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRRequestTopicPartition() LeaderAndISRRequestTopicPartition {
	var v LeaderAndISRRequestTopicPartition
	v.Default()
	return v
}

// LeaderAndISRResponseTopicPartition is a common struct that is used across
// different versions of LeaderAndISRResponse.
type LeaderAndISRResponseTopicPartition struct {
	Topic string // v0-v4

	Partition int32

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRResponseTopicPartition.
func (v *LeaderAndISRResponseTopicPartition) Default() {
}

// NewLeaderAndISRResponseTopicPartition returns a default LeaderAndISRResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRResponseTopicPartition() LeaderAndISRResponseTopicPartition {
	var v LeaderAndISRResponseTopicPartition
	v.Default()
	return v
}

type LeaderAndISRRequestTopicState struct {
	Topic string

	TopicID [16]byte // v5+

	PartitionStates []LeaderAndISRRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRRequestTopicState.
func (v *LeaderAndISRRequestTopicState) Default() {
}

// NewLeaderAndISRRequestTopicState returns a default LeaderAndISRRequestTopicState
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRRequestTopicState() LeaderAndISRRequestTopicState {
	var v LeaderAndISRRequestTopicState
	v.Default()
	return v
}

type LeaderAndISRRequestLiveLeader struct {
	BrokerID int32

	Host string

	Port int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRRequestLiveLeader.
func (v *LeaderAndISRRequestLiveLeader) Default() {
}

// NewLeaderAndISRRequestLiveLeader returns a default LeaderAndISRRequestLiveLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRRequestLiveLeader() LeaderAndISRRequestLiveLeader {
	var v LeaderAndISRRequestLiveLeader
	v.Default()
	return v
}

// LeaderAndISRRequest is an advanced request that controller brokers use
// to broadcast state to other brokers. Manually using this request is a
// great way to break your cluster.
//
// As this is an advanced request and there is little reason to issue it as a
// client, this request is undocumented.
//
// Kafka 1.0 introduced version 1. Kafka 2.2 introduced version 2, proposed
// in KIP-380, which changed the layout of the struct to be more memory
// efficient. Kafka 2.4.0 introduced version 3 with KIP-455.
// Kafka 3.4 introduced version 7 with KIP-866.
type LeaderAndISRRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ControllerID int32

	// If KRaft controller id is used during migration. See KIP-866.
	IsKRaftController bool // v7+

	ControllerEpoch int32

	// This field has a default of -1.
	BrokerEpoch int64 // v2+

	Type int8 // v5+

	PartitionStates []LeaderAndISRRequestTopicPartition // v0-v1

	TopicStates []LeaderAndISRRequestTopicState // v2+

	LiveLeaders []LeaderAndISRRequestLiveLeader

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*LeaderAndISRRequest) Key() int16                 { return 4 }
func (*LeaderAndISRRequest) MaxVersion() int16          { return 7 }
func (v *LeaderAndISRRequest) SetVersion(version int16) { v.Version = version }
func (v *LeaderAndISRRequest) GetVersion() int16        { return v.Version }
func (v *LeaderAndISRRequest) IsFlexible() bool         { return v.Version >= 4 }
func (v *LeaderAndISRRequest) ResponseKind() Response {
	r := &LeaderAndISRResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *LeaderAndISRRequest) RequestWith(ctx context.Context, r Requestor) (*LeaderAndISRResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*LeaderAndISRResponse)
	return resp, err
}

func (v *LeaderAndISRRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 7 {
		v := v.IsKRaftController
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.ControllerEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 2 {
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 5 {
		v := v.Type
		dst = kbin.AppendInt8(dst, v)
	}
	if version >= 0 && version <= 1 {
		v := v.PartitionStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 1 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ControllerEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Leader
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.LeaderEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ISR
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			{
				v := v.ZKVersion
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Replicas
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if version >= 3 {
				v := v.AddingReplicas
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if version >= 3 {
				v := v.RemovingReplicas
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if version >= 1 {
				v := v.IsNew
				dst = kbin.AppendBool(dst, v)
			}
			if version >= 6 {
				v := v.LeaderRecoveryState
				dst = kbin.AppendInt8(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 2 {
		v := v.TopicStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 5 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.PartitionStates
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					if version >= 0 && version <= 1 {
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ControllerEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Leader
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.ZKVersion
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 3 {
						v := v.AddingReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 3 {
						v := v.RemovingReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 1 {
						v := v.IsNew
						dst = kbin.AppendBool(dst, v)
					}
					if version >= 6 {
						v := v.LeaderRecoveryState
						dst = kbin.AppendInt8(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.LiveLeaders
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.BrokerID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *LeaderAndISRRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *LeaderAndISRRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *LeaderAndISRRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ControllerID = v
	}
	if version >= 7 {
		v := b.Bool()
		s.IsKRaftController = v
	}
	{
		v := b.Int32()
		s.ControllerEpoch = v
	}
	if version >= 2 {
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if version >= 5 {
		v := b.Int8()
		s.Type = v
	}
	if version >= 0 && version <= 1 {
		v := s.PartitionStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderAndISRRequestTopicPartition, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 1 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int32()
				s.ControllerEpoch = v
			}
			{
				v := b.Int32()
				s.Leader = v
			}
			{
				v := b.Int32()
				s.LeaderEpoch = v
			}
			{
				v := s.ISR
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.ISR = v
			}
			{
				v := b.Int32()
				s.ZKVersion = v
			}
			{
				v := s.Replicas
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Replicas = v
			}
			if version >= 3 {
				v := s.AddingReplicas
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.AddingReplicas = v
			}
			if version >= 3 {
				v := s.RemovingReplicas
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.RemovingReplicas = v
			}
			if version >= 1 {
				v := b.Bool()
				s.IsNew = v
			}
			if version >= 6 {
				v := b.Int8()
				s.LeaderRecoveryState = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.PartitionStates = v
	}
	if version >= 2 {
		v := s.TopicStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderAndISRRequestTopicState, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 5 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.PartitionStates
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]LeaderAndISRRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 0 && version <= 1 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.ControllerEpoch = v
					}
					{
						v := b.Int32()
						s.Leader = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := s.ISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.ISR = v
					}
					{
						v := b.Int32()
						s.ZKVersion = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					if version >= 3 {
						v := s.AddingReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.AddingReplicas = v
					}
					if version >= 3 {
						v := s.RemovingReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.RemovingReplicas = v
					}
					if version >= 1 {
						v := b.Bool()
						s.IsNew = v
					}
					if version >= 6 {
						v := b.Int8()
						s.LeaderRecoveryState = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.PartitionStates = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TopicStates = v
	}
	{
		v := s.LiveLeaders
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderAndISRRequestLiveLeader, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.BrokerID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.LiveLeaders = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrLeaderAndISRRequest returns a pointer to a default LeaderAndISRRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrLeaderAndISRRequest() *LeaderAndISRRequest {
	var v LeaderAndISRRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRRequest.
func (v *LeaderAndISRRequest) Default() {
	v.BrokerEpoch = -1
}

// NewLeaderAndISRRequest returns a default LeaderAndISRRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRRequest() LeaderAndISRRequest {
	var v LeaderAndISRRequest
	v.Default()
	return v
}

type LeaderAndISRResponseTopic struct {
	TopicID [16]byte

	Partitions []LeaderAndISRResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRResponseTopic.
func (v *LeaderAndISRResponseTopic) Default() {
}

// NewLeaderAndISRResponseTopic returns a default LeaderAndISRResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRResponseTopic() LeaderAndISRResponseTopic {
	var v LeaderAndISRResponseTopic
	v.Default()
	return v
}

// LeaderAndISRResponse is returned from a LeaderAndISRRequest.
type LeaderAndISRResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	Partitions []LeaderAndISRResponseTopicPartition // v0-v4

	Topics []LeaderAndISRResponseTopic // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*LeaderAndISRResponse) Key() int16                 { return 4 }
func (*LeaderAndISRResponse) MaxVersion() int16          { return 7 }
func (v *LeaderAndISRResponse) SetVersion(version int16) { v.Version = version }
func (v *LeaderAndISRResponse) GetVersion() int16        { return v.Version }
func (v *LeaderAndISRResponse) IsFlexible() bool         { return v.Version >= 4 }
func (v *LeaderAndISRResponse) RequestKind() Request     { return &LeaderAndISRRequest{Version: v.Version} }

func (v *LeaderAndISRResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 0 && version <= 4 {
		v := v.Partitions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 4 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 5 {
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					if version >= 0 && version <= 4 {
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *LeaderAndISRResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *LeaderAndISRResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *LeaderAndISRResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 0 && version <= 4 {
		v := s.Partitions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderAndISRResponseTopicPartition, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 4 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Partitions = v
	}
	if version >= 5 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaderAndISRResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]LeaderAndISRResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 0 && version <= 4 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrLeaderAndISRResponse returns a pointer to a default LeaderAndISRResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrLeaderAndISRResponse() *LeaderAndISRResponse {
	var v LeaderAndISRResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaderAndISRResponse.
func (v *LeaderAndISRResponse) Default() {
}

// NewLeaderAndISRResponse returns a default LeaderAndISRResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaderAndISRResponse() LeaderAndISRResponse {
	var v LeaderAndISRResponse
	v.Default()
	return v
}

type StopReplicaRequestTopicPartitionState struct {
	Partition int32

	// This field has a default of -1.
	LeaderEpoch int32

	Delete bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StopReplicaRequestTopicPartitionState.
func (v *StopReplicaRequestTopicPartitionState) Default() {
	v.LeaderEpoch = -1
}

// NewStopReplicaRequestTopicPartitionState returns a default StopReplicaRequestTopicPartitionState
// This is a shortcut for creating a struct and calling Default yourself.
func NewStopReplicaRequestTopicPartitionState() StopReplicaRequestTopicPartitionState {
	var v StopReplicaRequestTopicPartitionState
	v.Default()
	return v
}

type StopReplicaRequestTopic struct {
	Topic string

	Partition int32

	Partitions []int32 // v1-v2

	PartitionStates []StopReplicaRequestTopicPartitionState // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StopReplicaRequestTopic.
func (v *StopReplicaRequestTopic) Default() {
}

// NewStopReplicaRequestTopic returns a default StopReplicaRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewStopReplicaRequestTopic() StopReplicaRequestTopic {
	var v StopReplicaRequestTopic
	v.Default()
	return v
}

// StopReplicaRequest is an advanced request that brokers use to stop replicas.
//
// As this is an advanced request and there is little reason to issue it as a
// client, this request is undocumented.
//
// Kafka 2.2 introduced version 1, proposed in KIP-380, which changed the
// layout of the struct to be more memory efficient.
//
// Kafka 2.6 introduced version 3, proposed in KIP-570, reorganizes partitions
// to be stored and adds the leader epoch and delete partition fields per partition.
// Kafka 3.4 introduced version 4 with KIP-866.
type StopReplicaRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ControllerID int32

	ControllerEpoch int32

	// If KRaft controller id is used during migration. See KIP-866.
	IsKRaftController bool // v4+

	// This field has a default of -1.
	BrokerEpoch int64 // v1+

	DeletePartitions bool // v0-v2

	Topics []StopReplicaRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*StopReplicaRequest) Key() int16                 { return 5 }
func (*StopReplicaRequest) MaxVersion() int16          { return 4 }
func (v *StopReplicaRequest) SetVersion(version int16) { v.Version = version }
func (v *StopReplicaRequest) GetVersion() int16        { return v.Version }
func (v *StopReplicaRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *StopReplicaRequest) ResponseKind() Response {
	r := &StopReplicaResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *StopReplicaRequest) RequestWith(ctx context.Context, r Requestor) (*StopReplicaResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*StopReplicaResponse)
	return resp, err
}

func (v *StopReplicaRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ControllerEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 4 {
		v := v.IsKRaftController
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 1 {
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 0 && version <= 2 {
		v := v.DeletePartitions
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 0 && version <= 0 {
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 1 && version <= 2 {
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if version >= 3 {
				v := v.PartitionStates
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Delete
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StopReplicaRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StopReplicaRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StopReplicaRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ControllerID = v
	}
	{
		v := b.Int32()
		s.ControllerEpoch = v
	}
	if version >= 4 {
		v := b.Bool()
		s.IsKRaftController = v
	}
	if version >= 1 {
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if version >= 0 && version <= 2 {
		v := b.Bool()
		s.DeletePartitions = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StopReplicaRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 0 && version <= 0 {
				v := b.Int32()
				s.Partition = v
			}
			if version >= 1 && version <= 2 {
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if version >= 3 {
				v := s.PartitionStates
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]StopReplicaRequestTopicPartitionState, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Bool()
						s.Delete = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.PartitionStates = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStopReplicaRequest returns a pointer to a default StopReplicaRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStopReplicaRequest() *StopReplicaRequest {
	var v StopReplicaRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StopReplicaRequest.
func (v *StopReplicaRequest) Default() {
	v.BrokerEpoch = -1
}

// NewStopReplicaRequest returns a default StopReplicaRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewStopReplicaRequest() StopReplicaRequest {
	var v StopReplicaRequest
	v.Default()
	return v
}

type StopReplicaResponsePartition struct {
	Topic string

	Partition int32

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StopReplicaResponsePartition.
func (v *StopReplicaResponsePartition) Default() {
}

// NewStopReplicaResponsePartition returns a default StopReplicaResponsePartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewStopReplicaResponsePartition() StopReplicaResponsePartition {
	var v StopReplicaResponsePartition
	v.Default()
	return v
}

// StopReplicasResponse is returned from a StopReplicasRequest.
type StopReplicaResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Version 3 returns FENCED_LEADER_EPOCH if the leader is stale (KIP-570).
	ErrorCode int16

	Partitions []StopReplicaResponsePartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*StopReplicaResponse) Key() int16                 { return 5 }
func (*StopReplicaResponse) MaxVersion() int16          { return 4 }
func (v *StopReplicaResponse) SetVersion(version int16) { v.Version = version }
func (v *StopReplicaResponse) GetVersion() int16        { return v.Version }
func (v *StopReplicaResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *StopReplicaResponse) RequestKind() Request     { return &StopReplicaRequest{Version: v.Version} }

func (v *StopReplicaResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Partitions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StopReplicaResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StopReplicaResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StopReplicaResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Partitions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StopReplicaResponsePartition, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Partitions = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStopReplicaResponse returns a pointer to a default StopReplicaResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStopReplicaResponse() *StopReplicaResponse {
	var v StopReplicaResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StopReplicaResponse.
func (v *StopReplicaResponse) Default() {
}

// NewStopReplicaResponse returns a default StopReplicaResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewStopReplicaResponse() StopReplicaResponse {
	var v StopReplicaResponse
	v.Default()
	return v
}

type UpdateMetadataRequestTopicPartition struct {
	Topic string // v0-v4

	Partition int32

	ControllerEpoch int32

	Leader int32

	LeaderEpoch int32

	ISR []int32

	ZKVersion int32

	Replicas []int32

	OfflineReplicas []int32 // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataRequestTopicPartition.
func (v *UpdateMetadataRequestTopicPartition) Default() {
}

// NewUpdateMetadataRequestTopicPartition returns a default UpdateMetadataRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataRequestTopicPartition() UpdateMetadataRequestTopicPartition {
	var v UpdateMetadataRequestTopicPartition
	v.Default()
	return v
}

type UpdateMetadataRequestTopicState struct {
	Topic string

	TopicID [16]byte // v7+

	PartitionStates []UpdateMetadataRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataRequestTopicState.
func (v *UpdateMetadataRequestTopicState) Default() {
}

// NewUpdateMetadataRequestTopicState returns a default UpdateMetadataRequestTopicState
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataRequestTopicState() UpdateMetadataRequestTopicState {
	var v UpdateMetadataRequestTopicState
	v.Default()
	return v
}

type UpdateMetadataRequestLiveBrokerEndpoint struct {
	Port int32

	Host string

	ListenerName string // v3+

	SecurityProtocol int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataRequestLiveBrokerEndpoint.
func (v *UpdateMetadataRequestLiveBrokerEndpoint) Default() {
}

// NewUpdateMetadataRequestLiveBrokerEndpoint returns a default UpdateMetadataRequestLiveBrokerEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataRequestLiveBrokerEndpoint() UpdateMetadataRequestLiveBrokerEndpoint {
	var v UpdateMetadataRequestLiveBrokerEndpoint
	v.Default()
	return v
}

type UpdateMetadataRequestLiveBroker struct {
	ID int32

	Host string

	Port int32

	Endpoints []UpdateMetadataRequestLiveBrokerEndpoint // v1+

	Rack *string // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataRequestLiveBroker.
func (v *UpdateMetadataRequestLiveBroker) Default() {
}

// NewUpdateMetadataRequestLiveBroker returns a default UpdateMetadataRequestLiveBroker
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataRequestLiveBroker() UpdateMetadataRequestLiveBroker {
	var v UpdateMetadataRequestLiveBroker
	v.Default()
	return v
}

// UpdateMetadataRequest is an advanced request that brokers use to
// issue metadata updates to each other.
//
// As this is an advanced request and there is little reason to issue it as a
// client, this request is undocumented.
//
// Version 1 changed the layout of the live brokers.
//
// Kafka 2.2 introduced version 5, proposed in KIP-380, which changed the
// layout of the struct to be more memory efficient.
// Kafka 3.4 introduced version 8 with KIP-866.
type UpdateMetadataRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ControllerID int32

	// If KRaft controller id is used during migration. See KIP-866.
	IsKRaftController bool // v8+

	ControllerEpoch int32

	// This field has a default of -1.
	BrokerEpoch int64 // v5+

	PartitionStates []UpdateMetadataRequestTopicPartition // v0-v4

	TopicStates []UpdateMetadataRequestTopicState // v5+

	LiveBrokers []UpdateMetadataRequestLiveBroker

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*UpdateMetadataRequest) Key() int16                 { return 6 }
func (*UpdateMetadataRequest) MaxVersion() int16          { return 8 }
func (v *UpdateMetadataRequest) SetVersion(version int16) { v.Version = version }
func (v *UpdateMetadataRequest) GetVersion() int16        { return v.Version }
func (v *UpdateMetadataRequest) IsFlexible() bool         { return v.Version >= 6 }
func (v *UpdateMetadataRequest) ResponseKind() Response {
	r := &UpdateMetadataResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *UpdateMetadataRequest) RequestWith(ctx context.Context, r Requestor) (*UpdateMetadataResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*UpdateMetadataResponse)
	return resp, err
}

func (v *UpdateMetadataRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	{
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 8 {
		v := v.IsKRaftController
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.ControllerEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 5 {
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 0 && version <= 4 {
		v := v.PartitionStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 4 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ControllerEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Leader
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.LeaderEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ISR
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			{
				v := v.ZKVersion
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Replicas
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if version >= 4 {
				v := v.OfflineReplicas
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 5 {
		v := v.TopicStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 7 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.PartitionStates
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					if version >= 0 && version <= 4 {
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ControllerEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Leader
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.ZKVersion
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 4 {
						v := v.OfflineReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.LiveBrokers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ID
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 0 && version <= 0 {
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 0 && version <= 0 {
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 1 {
				v := v.Endpoints
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Port
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Host
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if version >= 3 {
						v := v.ListenerName
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.SecurityProtocol
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if version >= 2 {
				v := v.Rack
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateMetadataRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateMetadataRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateMetadataRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ControllerID = v
	}
	if version >= 8 {
		v := b.Bool()
		s.IsKRaftController = v
	}
	{
		v := b.Int32()
		s.ControllerEpoch = v
	}
	if version >= 5 {
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if version >= 0 && version <= 4 {
		v := s.PartitionStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateMetadataRequestTopicPartition, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 4 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int32()
				s.ControllerEpoch = v
			}
			{
				v := b.Int32()
				s.Leader = v
			}
			{
				v := b.Int32()
				s.LeaderEpoch = v
			}
			{
				v := s.ISR
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.ISR = v
			}
			{
				v := b.Int32()
				s.ZKVersion = v
			}
			{
				v := s.Replicas
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Replicas = v
			}
			if version >= 4 {
				v := s.OfflineReplicas
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.OfflineReplicas = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.PartitionStates = v
	}
	if version >= 5 {
		v := s.TopicStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateMetadataRequestTopicState, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 7 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.PartitionStates
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]UpdateMetadataRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 0 && version <= 4 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.ControllerEpoch = v
					}
					{
						v := b.Int32()
						s.Leader = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := s.ISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.ISR = v
					}
					{
						v := b.Int32()
						s.ZKVersion = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					if version >= 4 {
						v := s.OfflineReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.OfflineReplicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.PartitionStates = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TopicStates = v
	}
	{
		v := s.LiveBrokers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateMetadataRequestLiveBroker, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.ID = v
			}
			if version >= 0 && version <= 0 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			if version >= 0 && version <= 0 {
				v := b.Int32()
				s.Port = v
			}
			if version >= 1 {
				v := s.Endpoints
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]UpdateMetadataRequestLiveBrokerEndpoint, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Port = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					if version >= 3 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ListenerName = v
					}
					{
						v := b.Int16()
						s.SecurityProtocol = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Endpoints = v
			}
			if version >= 2 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Rack = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.LiveBrokers = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUpdateMetadataRequest returns a pointer to a default UpdateMetadataRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateMetadataRequest() *UpdateMetadataRequest {
	var v UpdateMetadataRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataRequest.
func (v *UpdateMetadataRequest) Default() {
	v.BrokerEpoch = -1
}

// NewUpdateMetadataRequest returns a default UpdateMetadataRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataRequest() UpdateMetadataRequest {
	var v UpdateMetadataRequest
	v.Default()
	return v
}

// UpdateMetadataResponses is returned from an UpdateMetadataRequest.
type UpdateMetadataResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*UpdateMetadataResponse) Key() int16                 { return 6 }
func (*UpdateMetadataResponse) MaxVersion() int16          { return 8 }
func (v *UpdateMetadataResponse) SetVersion(version int16) { v.Version = version }
func (v *UpdateMetadataResponse) GetVersion() int16        { return v.Version }
func (v *UpdateMetadataResponse) IsFlexible() bool         { return v.Version >= 6 }
func (v *UpdateMetadataResponse) RequestKind() Request {
	return &UpdateMetadataRequest{Version: v.Version}
}

func (v *UpdateMetadataResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateMetadataResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateMetadataResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateMetadataResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUpdateMetadataResponse returns a pointer to a default UpdateMetadataResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateMetadataResponse() *UpdateMetadataResponse {
	var v UpdateMetadataResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateMetadataResponse.
func (v *UpdateMetadataResponse) Default() {
}

// NewUpdateMetadataResponse returns a default UpdateMetadataResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateMetadataResponse() UpdateMetadataResponse {
	var v UpdateMetadataResponse
	v.Default()
	return v
}

// ControlledShutdownRequest is an advanced request that can be used to
// sthudown a broker in a controlled manner.
//
// As this is an advanced request and there is little reason to issue it as a
// client, this request is undocumented. However, the minimal amount of fields
// here makes the usage rather obvious.
//
// Kafka 2.2.0 introduced version 2, proposed in KIP-380.
//
// Note that version 0 of this request uses a special encoding format
// where the request does not include the client ID.
type ControlledShutdownRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	BrokerID int32

	// This field has a default of -1.
	BrokerEpoch int64 // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ControlledShutdownRequest) Key() int16                 { return 7 }
func (*ControlledShutdownRequest) MaxVersion() int16          { return 3 }
func (v *ControlledShutdownRequest) SetVersion(version int16) { v.Version = version }
func (v *ControlledShutdownRequest) GetVersion() int16        { return v.Version }
func (v *ControlledShutdownRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *ControlledShutdownRequest) ResponseKind() Response {
	r := &ControlledShutdownResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ControlledShutdownRequest) RequestWith(ctx context.Context, r Requestor) (*ControlledShutdownResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ControlledShutdownResponse)
	return resp, err
}

func (v *ControlledShutdownRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 2 {
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ControlledShutdownRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ControlledShutdownRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ControlledShutdownRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	if version >= 2 {
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrControlledShutdownRequest returns a pointer to a default ControlledShutdownRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrControlledShutdownRequest() *ControlledShutdownRequest {
	var v ControlledShutdownRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControlledShutdownRequest.
func (v *ControlledShutdownRequest) Default() {
	v.BrokerEpoch = -1
}

// NewControlledShutdownRequest returns a default ControlledShutdownRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewControlledShutdownRequest() ControlledShutdownRequest {
	var v ControlledShutdownRequest
	v.Default()
	return v
}

type ControlledShutdownResponsePartitionsRemaining struct {
	Topic string

	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControlledShutdownResponsePartitionsRemaining.
func (v *ControlledShutdownResponsePartitionsRemaining) Default() {
}

// NewControlledShutdownResponsePartitionsRemaining returns a default ControlledShutdownResponsePartitionsRemaining
// This is a shortcut for creating a struct and calling Default yourself.
func NewControlledShutdownResponsePartitionsRemaining() ControlledShutdownResponsePartitionsRemaining {
	var v ControlledShutdownResponsePartitionsRemaining
	v.Default()
	return v
}

// ControlledShutdownResponse is returned from a ControlledShutdownRequest.
type ControlledShutdownResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	PartitionsRemaining []ControlledShutdownResponsePartitionsRemaining

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ControlledShutdownResponse) Key() int16                 { return 7 }
func (*ControlledShutdownResponse) MaxVersion() int16          { return 3 }
func (v *ControlledShutdownResponse) SetVersion(version int16) { v.Version = version }
func (v *ControlledShutdownResponse) GetVersion() int16        { return v.Version }
func (v *ControlledShutdownResponse) IsFlexible() bool         { return v.Version >= 3 }
func (v *ControlledShutdownResponse) RequestKind() Request {
	return &ControlledShutdownRequest{Version: v.Version}
}

func (v *ControlledShutdownResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.PartitionsRemaining
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ControlledShutdownResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ControlledShutdownResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ControlledShutdownResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.PartitionsRemaining
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ControlledShutdownResponsePartitionsRemaining, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.PartitionsRemaining = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrControlledShutdownResponse returns a pointer to a default ControlledShutdownResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrControlledShutdownResponse() *ControlledShutdownResponse {
	var v ControlledShutdownResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControlledShutdownResponse.
func (v *ControlledShutdownResponse) Default() {
}

// NewControlledShutdownResponse returns a default ControlledShutdownResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewControlledShutdownResponse() ControlledShutdownResponse {
	var v ControlledShutdownResponse
	v.Default()
	return v
}

type OffsetCommitRequestTopicPartition struct {
	// Partition if a partition to commit offsets for.
	Partition int32

	// Offset is an offset to commit.
	Offset int64

	// Timestamp is the first iteration of tracking how long offset commits
	// should persist in Kafka. This field only existed for v1.
	// The expiration would be timestamp + offset.retention.minutes, or, if
	// timestamp was zero, current time + offset.retention.minutes.
	//
	// This field has a default of -1.
	Timestamp int64 // v1-v1

	// LeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0,
	// is the leader epoch of the record this request is committing.
	//
	// The initial leader epoch can be determined from a MetadataResponse.
	// To skip log truncation checking, use -1.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v6+

	// Metadata is optional data to include with committing the offset. This
	// can contain information such as which node is doing the committing, etc.
	Metadata *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitRequestTopicPartition.
func (v *OffsetCommitRequestTopicPartition) Default() {
	v.Timestamp = -1
	v.LeaderEpoch = -1
}

// NewOffsetCommitRequestTopicPartition returns a default OffsetCommitRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitRequestTopicPartition() OffsetCommitRequestTopicPartition {
	var v OffsetCommitRequestTopicPartition
	v.Default()
	return v
}

type OffsetCommitRequestTopic struct {
	// Topic is a topic to commit offsets for.
	Topic string // v0-v9

	// TopicID is the topic ID, replacing Topic in v10+.
	TopicID [16]byte // v10+

	// Partitions contains partitions in a topic for which to commit offsets.
	Partitions []OffsetCommitRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitRequestTopic.
func (v *OffsetCommitRequestTopic) Default() {
}

// NewOffsetCommitRequestTopic returns a default OffsetCommitRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitRequestTopic() OffsetCommitRequestTopic {
	var v OffsetCommitRequestTopic
	v.Default()
	return v
}

// OffsetCommitRequest commits offsets for consumed topics / partitions in
// a group.
// Version 10, introduced in Kafka 4.2, replaces topic names with topic IDs
// (KIP-848).
type OffsetCommitRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group this request is committing offsets to.
	Group string

	// Generation being -1 and group being empty means the group is being used
	// to store offsets only. No generation validation, no rebalancing.
	//
	// This field has a default of -1.
	Generation int32 // v1+

	// MemberID is the ID of the client issuing this request in the group.
	MemberID string // v1+

	// InstanceID is the instance ID of this member in the group (KIP-345).
	InstanceID *string // v7+

	// RetentionTimeMillis is how long this commit will persist in Kafka.
	//
	// This was introduced in v2, replacing an individual topic/partition's
	// Timestamp from v1, and was removed in v5 with Kafka 2.1.0.
	//
	// This was removed because rarely committing consumers could have their
	// offsets expired before committing, even though the consumer was still
	// active. After restarting or rebalancing, the consumer would now not know
	// the last committed offset and would have to start at the beginning or end,
	// leading to duplicates or log loss.
	//
	// Post 2.1.0, if this field is empty, offsets are only deleted once the
	// group is empty. Read KIP-211 for more details.
	//
	// This field has a default of -1.
	RetentionTimeMillis int64 // v2-v4

	// Topics is contains topics and partitions for which to commit offsets.
	Topics []OffsetCommitRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

func (*OffsetCommitRequest) Key() int16                   { return 8 }
func (*OffsetCommitRequest) MaxVersion() int16            { return 10 }
func (v *OffsetCommitRequest) SetVersion(version int16)   { v.Version = version }
func (v *OffsetCommitRequest) GetVersion() int16          { return v.Version }
func (v *OffsetCommitRequest) IsFlexible() bool           { return v.Version >= 8 }
func (v *OffsetCommitRequest) IsGroupCoordinatorRequest() {}
func (v *OffsetCommitRequest) ResponseKind() Response {
	r := &OffsetCommitResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *OffsetCommitRequest) RequestWith(ctx context.Context, r Requestor) (*OffsetCommitResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*OffsetCommitResponse)
	return resp, err
}

func (v *OffsetCommitRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 8
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 1 {
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 7 {
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 2 && version <= 4 {
		v := v.RetentionTimeMillis
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 9 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 10 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Offset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 1 && version <= 1 {
						v := v.Timestamp
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 6 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Metadata
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetCommitRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetCommitRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetCommitRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 8
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	if version >= 1 {
		v := b.Int32()
		s.Generation = v
	}
	if version >= 1 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 7 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	if version >= 2 && version <= 4 {
		v := b.Int64()
		s.RetentionTimeMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetCommitRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 9 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 10 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetCommitRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.Offset = v
					}
					if version >= 1 && version <= 1 {
						v := b.Int64()
						s.Timestamp = v
					}
					if version >= 6 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Metadata = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetCommitRequest returns a pointer to a default OffsetCommitRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetCommitRequest() *OffsetCommitRequest {
	var v OffsetCommitRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitRequest.
func (v *OffsetCommitRequest) Default() {
	v.Generation = -1
	v.RetentionTimeMillis = -1
}

// NewOffsetCommitRequest returns a default OffsetCommitRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitRequest() OffsetCommitRequest {
	var v OffsetCommitRequest
	v.Default()
	return v
}

type OffsetCommitResponseTopicPartition struct {
	// Partition is the partition in a topic this array slot corresponds to.
	Partition int32

	// ErrorCode is the error for this partition response.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// for the group.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// for the topic / partition.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the topic / partition does
	// not exist.
	//
	// OFFSET_METADATA_TOO_LARGE is returned if the request metadata is
	// larger than the brokers offset.metadata.max.bytes.
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// (due to the requested broker shutting down or it has not completed startup).
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// ILLEGAL_GENERATION is returned if the request's generation ID is invalid.
	//
	// UNKNOWN_MEMBER_ID is returned if the group is dead or the group does not
	// know of the request's member ID.
	//
	// REBALANCE_IN_PROGRESS is returned if the group is finishing a rebalance.
	//
	// INVALID_COMMIT_OFFSET_SIZE is returned if the offset commit results in
	// a record batch that is too large (likely due to large metadata).
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitResponseTopicPartition.
func (v *OffsetCommitResponseTopicPartition) Default() {
}

// NewOffsetCommitResponseTopicPartition returns a default OffsetCommitResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitResponseTopicPartition() OffsetCommitResponseTopicPartition {
	var v OffsetCommitResponseTopicPartition
	v.Default()
	return v
}

type OffsetCommitResponseTopic struct {
	// Topic is the topic this offset commit response corresponds to.
	Topic string // v0-v9

	// TopicID is the topic ID, replacing Topic in v10+.
	TopicID [16]byte // v10+

	// Partitions contains responses for each requested partition in
	// a topic.
	Partitions []OffsetCommitResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitResponseTopic.
func (v *OffsetCommitResponseTopic) Default() {
}

// NewOffsetCommitResponseTopic returns a default OffsetCommitResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitResponseTopic() OffsetCommitResponseTopic {
	var v OffsetCommitResponseTopic
	v.Default()
	return v
}

// OffsetCommitResponse is returned from an OffsetCommitRequest.
type OffsetCommitResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 4.
	ThrottleMillis int32 // v3+

	// Topics contains responses for each topic / partition in the commit request.
	Topics []OffsetCommitResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v8+
}

func (*OffsetCommitResponse) Key() int16                         { return 8 }
func (*OffsetCommitResponse) MaxVersion() int16                  { return 10 }
func (v *OffsetCommitResponse) SetVersion(version int16)         { v.Version = version }
func (v *OffsetCommitResponse) GetVersion() int16                { return v.Version }
func (v *OffsetCommitResponse) IsFlexible() bool                 { return v.Version >= 8 }
func (v *OffsetCommitResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 4 }
func (v *OffsetCommitResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *OffsetCommitResponse) RequestKind() Request             { return &OffsetCommitRequest{Version: v.Version} }

func (v *OffsetCommitResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 8
	_ = isFlexible
	if version >= 3 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 9 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 10 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetCommitResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetCommitResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetCommitResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 8
	_ = isFlexible
	s := v
	if version >= 3 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetCommitResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 9 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 10 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetCommitResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetCommitResponse returns a pointer to a default OffsetCommitResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetCommitResponse() *OffsetCommitResponse {
	var v OffsetCommitResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetCommitResponse.
func (v *OffsetCommitResponse) Default() {
}

// NewOffsetCommitResponse returns a default OffsetCommitResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetCommitResponse() OffsetCommitResponse {
	var v OffsetCommitResponse
	v.Default()
	return v
}

type OffsetFetchRequestTopic struct {
	// Topic is a topic to fetch offsets for.
	Topic string

	// Partitions in a list of partitions in a group to fetch offsets for.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchRequestTopic.
func (v *OffsetFetchRequestTopic) Default() {
}

// NewOffsetFetchRequestTopic returns a default OffsetFetchRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchRequestTopic() OffsetFetchRequestTopic {
	var v OffsetFetchRequestTopic
	v.Default()
	return v
}

type OffsetFetchRequestGroupTopic struct {
	Topic string // v8-v9

	// TopicID is the topic ID, replacing Topic in v10+.
	TopicID [16]byte // v10+

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchRequestGroupTopic.
func (v *OffsetFetchRequestGroupTopic) Default() {
}

// NewOffsetFetchRequestGroupTopic returns a default OffsetFetchRequestGroupTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchRequestGroupTopic() OffsetFetchRequestGroupTopic {
	var v OffsetFetchRequestGroupTopic
	v.Default()
	return v
}

type OffsetFetchRequestGroup struct {
	Group string

	// The member ID assigned by the group coordinator if using the new consumer protocol (KIP-848).
	MemberID *string // v9+

	// The member epoch if using the new consumer protocol (KIP-848).
	//
	// This field has a default of -1.
	MemberEpoch int32 // v9+

	Topics []OffsetFetchRequestGroupTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchRequestGroup.
func (v *OffsetFetchRequestGroup) Default() {
	v.MemberEpoch = -1
}

// NewOffsetFetchRequestGroup returns a default OffsetFetchRequestGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchRequestGroup() OffsetFetchRequestGroup {
	var v OffsetFetchRequestGroup
	v.Default()
	return v
}

// OffsetFetchRequest requests the most recent committed offsets for topic
// partitions in a group.
// Version 10, introduced in Kafka 4.2, replaces topic names with topic IDs
// in the Groups field (KIP-848).
type OffsetFetchRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group to fetch offsets for.
	Group string // v0-v7

	// Topics contains topics to fetch offets for. Version 2+ allows this to be
	// null to return all topics the client is authorized to describe in the group.
	Topics []OffsetFetchRequestTopic // v0-v7

	// Groups, introduced in v8 (Kafka 3.0), allows for fetching offsets for
	// multiple groups at a time.
	//
	// The fields here mirror the old top level fields on the request, thus they
	// are left undocumented. Refer to the top level documentation if necessary.
	Groups []OffsetFetchRequestGroup // v8+

	// RequireStable signifies whether the broker should wait on returning
	// unstable offsets, instead setting a retryable error on the relevant
	// unstable partitions (UNSTABLE_OFFSET_COMMIT). See KIP-447 for more
	// details.
	RequireStable bool // v7+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*OffsetFetchRequest) Key() int16                   { return 9 }
func (*OffsetFetchRequest) MaxVersion() int16            { return 10 }
func (v *OffsetFetchRequest) SetVersion(version int16)   { v.Version = version }
func (v *OffsetFetchRequest) GetVersion() int16          { return v.Version }
func (v *OffsetFetchRequest) IsFlexible() bool           { return v.Version >= 6 }
func (v *OffsetFetchRequest) IsGroupCoordinatorRequest() {}
func (v *OffsetFetchRequest) ResponseKind() Response {
	r := &OffsetFetchResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *OffsetFetchRequest) RequestWith(ctx context.Context, r Requestor) (*OffsetFetchResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*OffsetFetchResponse)
	return resp, err
}

func (v *OffsetFetchRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	if version >= 0 && version <= 7 {
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 0 && version <= 7 {
		v := v.Topics
		if version >= 2 {
			if isFlexible {
				dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
			} else {
				dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
			}
		} else {
			if isFlexible {
				dst = kbin.AppendCompactArrayLen(dst, len(v))
			} else {
				dst = kbin.AppendArrayLen(dst, len(v))
			}
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 8 {
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 9 {
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if version >= 9 {
				v := v.MemberEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
				} else {
					dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
				}
				for i := range v {
					v := &v[i]
					if version >= 8 && version <= 9 {
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if version >= 10 {
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 7 {
		v := v.RequireStable
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetFetchRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetFetchRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetFetchRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	if version >= 0 && version <= 7 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	if version >= 0 && version <= 7 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 2 || l == 0 {
			a = []OffsetFetchRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetFetchRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 8 {
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetFetchRequestGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			if version >= 9 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.MemberID = v
			}
			if version >= 9 {
				v := b.Int32()
				s.MemberEpoch = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if version < 0 || l == 0 {
					a = []OffsetFetchRequestGroupTopic{}
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetFetchRequestGroupTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 8 && version <= 9 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					if version >= 10 {
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if version >= 7 {
		v := b.Bool()
		s.RequireStable = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetFetchRequest returns a pointer to a default OffsetFetchRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetFetchRequest() *OffsetFetchRequest {
	var v OffsetFetchRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchRequest.
func (v *OffsetFetchRequest) Default() {
}

// NewOffsetFetchRequest returns a default OffsetFetchRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchRequest() OffsetFetchRequest {
	var v OffsetFetchRequest
	v.Default()
	return v
}

type OffsetFetchResponseTopicPartition struct {
	// Partition is the partition in a topic this array slot corresponds to.
	Partition int32

	// Offset is the most recently committed offset for this topic partition
	// in a group.
	Offset int64

	// LeaderEpoch is the leader epoch of the last consumed record.
	//
	// This was proposed in KIP-320 and introduced in Kafka 2.1.0 and allows
	// clients to detect log truncation. See the KIP for more details.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v5+

	// Metadata is client provided metadata corresponding to the offset commit.
	// This can be useful for adding who made the commit, etc.
	Metadata *string

	// ErrorCode is the error for this partition response.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to the group.
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// (due to the requested broker shutting down or it has not completed startup).
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the requested topic or partition
	// is unknown.
	//
	// UNSTABLE_OFFSET_COMMIT is returned for v7+ if the request set RequireStable.
	// See KIP-447 for more details.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponseTopicPartition.
func (v *OffsetFetchResponseTopicPartition) Default() {
	v.LeaderEpoch = -1
}

// NewOffsetFetchResponseTopicPartition returns a default OffsetFetchResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponseTopicPartition() OffsetFetchResponseTopicPartition {
	var v OffsetFetchResponseTopicPartition
	v.Default()
	return v
}

type OffsetFetchResponseTopic struct {
	// Topic is the topic this offset fetch response corresponds to.
	Topic string

	// Partitions contains responses for each requested partition in
	// a topic.
	Partitions []OffsetFetchResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponseTopic.
func (v *OffsetFetchResponseTopic) Default() {
}

// NewOffsetFetchResponseTopic returns a default OffsetFetchResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponseTopic() OffsetFetchResponseTopic {
	var v OffsetFetchResponseTopic
	v.Default()
	return v
}

type OffsetFetchResponseGroupTopicPartition struct {
	Partition int32

	Offset int64

	// This field has a default of -1.
	LeaderEpoch int32

	Metadata *string

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponseGroupTopicPartition.
func (v *OffsetFetchResponseGroupTopicPartition) Default() {
	v.LeaderEpoch = -1
}

// NewOffsetFetchResponseGroupTopicPartition returns a default OffsetFetchResponseGroupTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponseGroupTopicPartition() OffsetFetchResponseGroupTopicPartition {
	var v OffsetFetchResponseGroupTopicPartition
	v.Default()
	return v
}

type OffsetFetchResponseGroupTopic struct {
	Topic string // v8-v9

	// TopicID is the topic ID, replacing Topic in v10+.
	TopicID [16]byte // v10+

	Partitions []OffsetFetchResponseGroupTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponseGroupTopic.
func (v *OffsetFetchResponseGroupTopic) Default() {
}

// NewOffsetFetchResponseGroupTopic returns a default OffsetFetchResponseGroupTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponseGroupTopic() OffsetFetchResponseGroupTopic {
	var v OffsetFetchResponseGroupTopic
	v.Default()
	return v
}

type OffsetFetchResponseGroup struct {
	Group string

	Topics []OffsetFetchResponseGroupTopic

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponseGroup.
func (v *OffsetFetchResponseGroup) Default() {
}

// NewOffsetFetchResponseGroup returns a default OffsetFetchResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponseGroup() OffsetFetchResponseGroup {
	var v OffsetFetchResponseGroup
	v.Default()
	return v
}

// OffsetFetchResponse is returned from an OffsetFetchRequest.
type OffsetFetchResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 4.
	ThrottleMillis int32 // v3+

	// Topics contains responses for each requested topic/partition.
	Topics []OffsetFetchResponseTopic // v0-v7

	// ErrorCode is a top level error code that applies to all topic/partitions.
	// This will be any group error.
	ErrorCode int16 // v2-v7

	// Groups is the response for all groups. Each field mirrors the fields in the
	// top level request, thus they are left undocumented. Refer to the top level
	// documentation if necessary.
	Groups []OffsetFetchResponseGroup // v8+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*OffsetFetchResponse) Key() int16                         { return 9 }
func (*OffsetFetchResponse) MaxVersion() int16                  { return 10 }
func (v *OffsetFetchResponse) SetVersion(version int16)         { v.Version = version }
func (v *OffsetFetchResponse) GetVersion() int16                { return v.Version }
func (v *OffsetFetchResponse) IsFlexible() bool                 { return v.Version >= 6 }
func (v *OffsetFetchResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 4 }
func (v *OffsetFetchResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *OffsetFetchResponse) RequestKind() Request             { return &OffsetFetchRequest{Version: v.Version} }

func (v *OffsetFetchResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	if version >= 3 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 0 && version <= 7 {
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Offset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 5 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Metadata
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 2 && version <= 7 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 8 {
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					if version >= 8 && version <= 9 {
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if version >= 10 {
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.Offset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LeaderEpoch
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.Metadata
								if isFlexible {
									dst = kbin.AppendCompactNullableString(dst, v)
								} else {
									dst = kbin.AppendNullableString(dst, v)
								}
							}
							{
								v := v.ErrorCode
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetFetchResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetFetchResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetFetchResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	if version >= 3 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 0 && version <= 7 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetFetchResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetFetchResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.Offset = v
					}
					if version >= 5 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Metadata = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 2 && version <= 7 {
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 8 {
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetFetchResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetFetchResponseGroupTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 8 && version <= 9 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					if version >= 10 {
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]OffsetFetchResponseGroupTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int64()
								s.Offset = v
							}
							{
								v := b.Int32()
								s.LeaderEpoch = v
							}
							{
								var v *string
								if isFlexible {
									if unsafe {
										v = b.UnsafeCompactNullableString()
									} else {
										v = b.CompactNullableString()
									}
								} else {
									if unsafe {
										v = b.UnsafeNullableString()
									} else {
										v = b.NullableString()
									}
								}
								s.Metadata = v
							}
							{
								v := b.Int16()
								s.ErrorCode = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetFetchResponse returns a pointer to a default OffsetFetchResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetFetchResponse() *OffsetFetchResponse {
	var v OffsetFetchResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetFetchResponse.
func (v *OffsetFetchResponse) Default() {
}

// NewOffsetFetchResponse returns a default OffsetFetchResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetFetchResponse() OffsetFetchResponse {
	var v OffsetFetchResponse
	v.Default()
	return v
}

// FindCoordinatorRequest requests the coordinator for a group or transaction.
//
// This coordinator is different from the broker leader coordinator. This
// coordinator is the partition leader for the partition that is storing
// the group or transaction ID.
//
// Kafka 3.9, introducing request version 6, adds support for share groups (see KIP-932).
// The format for key type SHARE(2) is "groupId:topicId:partition".
type FindCoordinatorRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// CoordinatorKey is the ID to use for finding the coordinator. For groups,
	// this is the group name, for transactional producer, this is the
	// transactional ID.
	CoordinatorKey string // v0-v3

	// CoordinatorType is the type that key is. Groups are type 0,
	// transactional IDs are type 1, share groups are 2.
	CoordinatorType int8 // v1+

	// CoordinatorKeys contains all keys to find the coordinator for.
	CoordinatorKeys []string // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*FindCoordinatorRequest) Key() int16                 { return 10 }
func (*FindCoordinatorRequest) MaxVersion() int16          { return 6 }
func (v *FindCoordinatorRequest) SetVersion(version int16) { v.Version = version }
func (v *FindCoordinatorRequest) GetVersion() int16        { return v.Version }
func (v *FindCoordinatorRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *FindCoordinatorRequest) ResponseKind() Response {
	r := &FindCoordinatorResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *FindCoordinatorRequest) RequestWith(ctx context.Context, r Requestor) (*FindCoordinatorResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*FindCoordinatorResponse)
	return resp, err
}

func (v *FindCoordinatorRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 0 && version <= 3 {
		v := v.CoordinatorKey
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 1 {
		v := v.CoordinatorType
		dst = kbin.AppendInt8(dst, v)
	}
	if version >= 4 {
		v := v.CoordinatorKeys
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FindCoordinatorRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FindCoordinatorRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FindCoordinatorRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 0 && version <= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.CoordinatorKey = v
	}
	if version >= 1 {
		v := b.Int8()
		s.CoordinatorType = v
	}
	if version >= 4 {
		v := s.CoordinatorKeys
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.CoordinatorKeys = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrFindCoordinatorRequest returns a pointer to a default FindCoordinatorRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFindCoordinatorRequest() *FindCoordinatorRequest {
	var v FindCoordinatorRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FindCoordinatorRequest.
func (v *FindCoordinatorRequest) Default() {
}

// NewFindCoordinatorRequest returns a default FindCoordinatorRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewFindCoordinatorRequest() FindCoordinatorRequest {
	var v FindCoordinatorRequest
	v.Default()
	return v
}

type FindCoordinatorResponseCoordinator struct {
	Key string

	NodeID int32

	Host string

	Port int32

	ErrorCode int16

	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FindCoordinatorResponseCoordinator.
func (v *FindCoordinatorResponseCoordinator) Default() {
}

// NewFindCoordinatorResponseCoordinator returns a default FindCoordinatorResponseCoordinator
// This is a shortcut for creating a struct and calling Default yourself.
func NewFindCoordinatorResponseCoordinator() FindCoordinatorResponseCoordinator {
	var v FindCoordinatorResponseCoordinator
	v.Default()
	return v
}

// FindCoordinatorResponse is returned from a FindCoordinatorRequest.
type FindCoordinatorResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// ErrorCode is the error returned for the request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if for a group ID request and the
	// client is not authorized to describe groups.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned for a transactional ID
	// request and the client is not authorized to describe transactional IDs.
	//
	// INVALID_REQUEST is returned if not asking for a known type (group,
	// or transaction).
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// for the requested ID, which would be if the group or transactional topic
	// does not exist or the partition the requested key maps to is not available.
	ErrorCode int16 // v0-v3

	// ErrorMessage is an informative message if the request errored.
	ErrorMessage *string // v1-v3

	// NodeID is the broker ID of the coordinator.
	NodeID int32 // v0-v3

	// Host is the host of the coordinator.
	Host string // v0-v3

	// Port is the port of the coordinator.
	Port int32 // v0-v3

	// Coordinators, introduced for KIP-699, is the bulk response for
	// coordinators. The fields in the struct exactly match the original fields
	// in the FindCoordinatorResponse, thus they are left undocumented.
	Coordinators []FindCoordinatorResponseCoordinator // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*FindCoordinatorResponse) Key() int16                 { return 10 }
func (*FindCoordinatorResponse) MaxVersion() int16          { return 6 }
func (v *FindCoordinatorResponse) SetVersion(version int16) { v.Version = version }
func (v *FindCoordinatorResponse) GetVersion() int16        { return v.Version }
func (v *FindCoordinatorResponse) IsFlexible() bool         { return v.Version >= 3 }
func (v *FindCoordinatorResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 2 }
func (v *FindCoordinatorResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *FindCoordinatorResponse) RequestKind() Request {
	return &FindCoordinatorRequest{Version: v.Version}
}

func (v *FindCoordinatorResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 0 && version <= 3 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 1 && version <= 3 {
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 0 && version <= 3 {
		v := v.NodeID
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 0 && version <= 3 {
		v := v.Host
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 0 && version <= 3 {
		v := v.Port
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 4 {
		v := v.Coordinators
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Key
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FindCoordinatorResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FindCoordinatorResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FindCoordinatorResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 0 && version <= 3 {
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 1 && version <= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if version >= 0 && version <= 3 {
		v := b.Int32()
		s.NodeID = v
	}
	if version >= 0 && version <= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Host = v
	}
	if version >= 0 && version <= 3 {
		v := b.Int32()
		s.Port = v
	}
	if version >= 4 {
		v := s.Coordinators
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FindCoordinatorResponseCoordinator, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Key = v
			}
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Coordinators = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrFindCoordinatorResponse returns a pointer to a default FindCoordinatorResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFindCoordinatorResponse() *FindCoordinatorResponse {
	var v FindCoordinatorResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FindCoordinatorResponse.
func (v *FindCoordinatorResponse) Default() {
}

// NewFindCoordinatorResponse returns a default FindCoordinatorResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewFindCoordinatorResponse() FindCoordinatorResponse {
	var v FindCoordinatorResponse
	v.Default()
	return v
}

type JoinGroupRequestProtocol struct {
	// Name is a name of a protocol. This is arbitrary, but is used
	// in the official client to agree on a partition balancing strategy.
	//
	// The official client uses range, roundrobin, or sticky (which was
	// introduced in KIP-54).
	Name string

	// Metadata is arbitrary information to pass along with this
	// protocol name for this member.
	//
	// Note that while this is not documented in any protocol page,
	// this is usually a serialized GroupMemberMetadata as described in
	// https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Client-side+Assignment+Proposal.
	//
	// The protocol metadata is where group members will communicate which
	// topics they collectively as a group want to consume.
	Metadata []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to JoinGroupRequestProtocol.
func (v *JoinGroupRequestProtocol) Default() {
}

// NewJoinGroupRequestProtocol returns a default JoinGroupRequestProtocol
// This is a shortcut for creating a struct and calling Default yourself.
func NewJoinGroupRequestProtocol() JoinGroupRequestProtocol {
	var v JoinGroupRequestProtocol
	v.Default()
	return v
}

// JoinGroupRequest issues a request to join a Kafka group. This will create a
// group if one does not exist. If joining an existing group, this may trigger
// a group rebalance.
//
// This will trigger a group rebalance if the request is from the group leader,
// or if the request is from a group member with different metadata, or if the
// request is with a new group member.
//
// Version 4 introduced replying to joins of existing groups with
// MEMBER_ID_REQUIRED, which requires re-issuing the join group with the
// returned member ID. See KIP-394 for more details.
//
// Version 5 introduced InstanceID, allowing for more "static" membership.
// See KIP-345 for more details.
type JoinGroupRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group to join.
	Group string

	// SessionTimeoutMillis is how long a member in the group can go between
	// heartbeats. If a member does not send a heartbeat within this timeout,
	// the broker will remove the member from the group and initiate a rebalance.
	SessionTimeoutMillis int32

	// RebalanceTimeoutMillis is how long the broker waits for members to join a group
	// once a rebalance begins. Kafka waits for the longest rebalance of all
	// members in the group. Member sessions are still alive; heartbeats will be
	// replied to with REBALANCE_IN_PROGRESS. Those members must transition to
	// joining within this rebalance timeout. Members that do not rejoin within
	// this timeout will be removed from the group. Members must commit offsets
	// within this timeout.
	//
	// The first join for a new group has a 3 second grace period for other
	// members to join; this grace period is extended until the RebalanceTimeoutMillis
	// is up or until 3 seconds lapse with no new members.
	//
	// This field has a default of -1.
	RebalanceTimeoutMillis int32 // v1+

	// MemberID is the member ID to join the group with. When joining a group for
	// the first time, use the empty string. The response will contain the member
	// ID that should be used going forward.
	MemberID string

	// InstanceID is a user configured ID that is used for making a group
	// member "static", allowing many rebalances to be avoided.
	InstanceID *string // v5+

	// ProtocolType is the "type" of protocol being used for the join group.
	// The initial group creation sets the type; all additional members must
	// have the same type or they will be rejected.
	//
	// This is completely arbitrary, but the Java client and everything else
	// uses "consumer" as the protocol type.
	ProtocolType string

	// Protocols contains arbitrary information that group members use
	// for rebalancing. All group members must agree on at least one protocol
	// name.
	Protocols []JoinGroupRequestProtocol

	// Reason is an optional reason the member is joining (or rejoining) the
	// group (KIP-800, Kafka 3.2+).
	Reason *string // v8+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*JoinGroupRequest) Key() int16                   { return 11 }
func (*JoinGroupRequest) MaxVersion() int16            { return 9 }
func (v *JoinGroupRequest) SetVersion(version int16)   { v.Version = version }
func (v *JoinGroupRequest) GetVersion() int16          { return v.Version }
func (v *JoinGroupRequest) IsFlexible() bool           { return v.Version >= 6 }
func (v *JoinGroupRequest) IsGroupCoordinatorRequest() {}
func (v *JoinGroupRequest) ResponseKind() Response {
	r := &JoinGroupResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *JoinGroupRequest) RequestWith(ctx context.Context, r Requestor) (*JoinGroupResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*JoinGroupResponse)
	return resp, err
}

func (v *JoinGroupRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.SessionTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.RebalanceTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 5 {
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.ProtocolType
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Protocols
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Metadata
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 8 {
		v := v.Reason
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *JoinGroupRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *JoinGroupRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *JoinGroupRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		v := b.Int32()
		s.SessionTimeoutMillis = v
	}
	if version >= 1 {
		v := b.Int32()
		s.RebalanceTimeoutMillis = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 5 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ProtocolType = v
	}
	{
		v := s.Protocols
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]JoinGroupRequestProtocol, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.Metadata = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Protocols = v
	}
	if version >= 8 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Reason = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrJoinGroupRequest returns a pointer to a default JoinGroupRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrJoinGroupRequest() *JoinGroupRequest {
	var v JoinGroupRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to JoinGroupRequest.
func (v *JoinGroupRequest) Default() {
	v.RebalanceTimeoutMillis = -1
}

// NewJoinGroupRequest returns a default JoinGroupRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewJoinGroupRequest() JoinGroupRequest {
	var v JoinGroupRequest
	v.Default()
	return v
}

type JoinGroupResponseMember struct {
	// MemberID is a member in this group.
	MemberID string

	// InstanceID is an instance ID of a member in this group (KIP-345).
	InstanceID *string // v5+

	// ProtocolMetadata is the metadata for this member for this protocol.
	// This is usually of type GroupMemberMetadata.
	ProtocolMetadata []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to JoinGroupResponseMember.
func (v *JoinGroupResponseMember) Default() {
}

// NewJoinGroupResponseMember returns a default JoinGroupResponseMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewJoinGroupResponseMember() JoinGroupResponseMember {
	var v JoinGroupResponseMember
	v.Default()
	return v
}

// JoinGroupResponse is returned from a JoinGroupRequest.
type JoinGroupResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 3.
	ThrottleMillis int32 // v2+

	// ErrorCode is the error for the join group request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to the group (no read perms).
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// (due to the requested broker shutting down or it has not completed startup).
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// INVALID_SESSION_TIMEOUT is returned if the requested SessionTimeout is
	// not within the broker's group.{min,max}.session.timeout.ms.
	//
	// INCONSISTENT_GROUP_PROTOCOL is returned if the requested protocols are
	// incompatible with the existing group member's protocols, or if the join
	// was for a new group but contained no protocols.
	//
	// UNKNOWN_MEMBER_ID is returned is the requested group is dead (likely
	// just migrated to another coordinator or the group is temporarily unstable),
	// or if the request was for a new group but contained a non-empty member ID,
	// or if the group does not have the requested member ID (and the client must
	// do the new-join-group dance).
	//
	// MEMBER_ID_REQUIRED is returned on the initial join of an existing group.
	// This error was proposed in KIP-394 and introduced in Kafka 2.2.0 to
	// prevent flaky clients from continually triggering rebalances and prevent
	// these clients from consuming RAM with metadata. If a client sees
	// this error, it should re-issue the join with the MemberID in the response.
	// Non-flaky clients will join with this new member ID, but flaky clients
	// will not join quickly enough before the pending member ID is rotated out
	// due to hitting the session.timeout.ms.
	//
	// GROUP_MAX_SIZE_REACHED is returned as of Kafka 2.2.0 if the group has
	// reached a broker's group.max.size.
	ErrorCode int16

	// Generation is the current "generation" of this group.
	//
	// This field has a default of -1.
	Generation int32

	// ProtocolType is the "type" of protocol being used for this group.
	ProtocolType *string // v7+

	// Protocol is the agreed upon protocol name (i.e. "sticky", "range").
	//
	// v7 of this response changed this field to be nullable.
	Protocol *string

	// LeaderID is the leader member.
	LeaderID string

	// True if the leader must skip running the assignment (KIP-814, Kafka 3.2+).
	SkipAssignment bool // v9+

	// MemberID is the member of the receiving client.
	MemberID string

	// Members contains all other members of this group. Only the group leader
	// receives the members. The leader is responsible for balancing subscribed
	// topic partitions and replying appropriately in a SyncGroup request.
	Members []JoinGroupResponseMember

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v6+
}

func (*JoinGroupResponse) Key() int16                         { return 11 }
func (*JoinGroupResponse) MaxVersion() int16                  { return 9 }
func (v *JoinGroupResponse) SetVersion(version int16)         { v.Version = version }
func (v *JoinGroupResponse) GetVersion() int16                { return v.Version }
func (v *JoinGroupResponse) IsFlexible() bool                 { return v.Version >= 6 }
func (v *JoinGroupResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 3 }
func (v *JoinGroupResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *JoinGroupResponse) RequestKind() Request             { return &JoinGroupRequest{Version: v.Version} }

func (v *JoinGroupResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	if version >= 2 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 7 {
		v := v.ProtocolType
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Protocol
		if version < 7 {
			var vv string
			if v != nil {
				vv = *v
			}
			{
				v := vv
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
		} else {
			if isFlexible {
				dst = kbin.AppendCompactNullableString(dst, v)
			} else {
				dst = kbin.AppendNullableString(dst, v)
			}
		}
	}
	{
		v := v.LeaderID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 9 {
		v := v.SkipAssignment
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Members
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 5 {
				v := v.InstanceID
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ProtocolMetadata
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *JoinGroupResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *JoinGroupResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *JoinGroupResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 6
	_ = isFlexible
	s := v
	if version >= 2 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int32()
		s.Generation = v
	}
	if version >= 7 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ProtocolType = v
	}
	{
		var v *string
		if version < 7 {
			var vv string
			if isFlexible {
				if unsafe {
					vv = b.UnsafeCompactString()
				} else {
					vv = b.CompactString()
				}
			} else {
				if unsafe {
					vv = b.UnsafeString()
				} else {
					vv = b.String()
				}
			}
			v = &vv
		} else {
			if isFlexible {
				if unsafe {
					v = b.UnsafeCompactNullableString()
				} else {
					v = b.CompactNullableString()
				}
			} else {
				if unsafe {
					v = b.UnsafeNullableString()
				} else {
					v = b.NullableString()
				}
			}
		}
		s.Protocol = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.LeaderID = v
	}
	if version >= 9 {
		v := b.Bool()
		s.SkipAssignment = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	{
		v := s.Members
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]JoinGroupResponseMember, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.MemberID = v
			}
			if version >= 5 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.InstanceID = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.ProtocolMetadata = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Members = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrJoinGroupResponse returns a pointer to a default JoinGroupResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrJoinGroupResponse() *JoinGroupResponse {
	var v JoinGroupResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to JoinGroupResponse.
func (v *JoinGroupResponse) Default() {
	v.Generation = -1
}

// NewJoinGroupResponse returns a default JoinGroupResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewJoinGroupResponse() JoinGroupResponse {
	var v JoinGroupResponse
	v.Default()
	return v
}

// HeartbeatRequest issues a heartbeat for a member in a group, ensuring that
// Kafka does not expire the member from the group.
type HeartbeatRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group ID this heartbeat is for.
	Group string

	// Generation is the group generation this heartbeat is for.
	Generation int32

	// MemberID is the member ID this member is for.
	MemberID string

	// InstanceID is the instance ID of this member in the group (KIP-345).
	InstanceID *string // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*HeartbeatRequest) Key() int16                   { return 12 }
func (*HeartbeatRequest) MaxVersion() int16            { return 4 }
func (v *HeartbeatRequest) SetVersion(version int16)   { v.Version = version }
func (v *HeartbeatRequest) GetVersion() int16          { return v.Version }
func (v *HeartbeatRequest) IsFlexible() bool           { return v.Version >= 4 }
func (v *HeartbeatRequest) IsGroupCoordinatorRequest() {}
func (v *HeartbeatRequest) ResponseKind() Response {
	r := &HeartbeatResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *HeartbeatRequest) RequestWith(ctx context.Context, r Requestor) (*HeartbeatResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*HeartbeatResponse)
	return resp, err
}

func (v *HeartbeatRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *HeartbeatRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *HeartbeatRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *HeartbeatRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		v := b.Int32()
		s.Generation = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrHeartbeatRequest returns a pointer to a default HeartbeatRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrHeartbeatRequest() *HeartbeatRequest {
	var v HeartbeatRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to HeartbeatRequest.
func (v *HeartbeatRequest) Default() {
}

// NewHeartbeatRequest returns a default HeartbeatRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewHeartbeatRequest() HeartbeatRequest {
	var v HeartbeatRequest
	v.Default()
	return v
}

// HeartbeatResponse is returned from a HeartbeatRequest.
type HeartbeatResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// ErrorCode is the error for the heartbeat request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to the group (no read perms).
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// (due to the requested broker shutting down or it has not completed startup).
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// UNKNOWN_MEMBER_ID is returned if the member ID is not a part of the group,
	// or if the group is empty or dead.
	//
	// ILLEGAL_GENERATION is returned if the request's generation ID is invalid.
	//
	// REBALANCE_IN_PROGRESS is returned if the group is currently rebalancing.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*HeartbeatResponse) Key() int16                         { return 12 }
func (*HeartbeatResponse) MaxVersion() int16                  { return 4 }
func (v *HeartbeatResponse) SetVersion(version int16)         { v.Version = version }
func (v *HeartbeatResponse) GetVersion() int16                { return v.Version }
func (v *HeartbeatResponse) IsFlexible() bool                 { return v.Version >= 4 }
func (v *HeartbeatResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *HeartbeatResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *HeartbeatResponse) RequestKind() Request             { return &HeartbeatRequest{Version: v.Version} }

func (v *HeartbeatResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *HeartbeatResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *HeartbeatResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *HeartbeatResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrHeartbeatResponse returns a pointer to a default HeartbeatResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrHeartbeatResponse() *HeartbeatResponse {
	var v HeartbeatResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to HeartbeatResponse.
func (v *HeartbeatResponse) Default() {
}

// NewHeartbeatResponse returns a default HeartbeatResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewHeartbeatResponse() HeartbeatResponse {
	var v HeartbeatResponse
	v.Default()
	return v
}

type LeaveGroupRequestMember struct {
	MemberID string

	InstanceID *string

	// Reason is an optional reason why this member is leaving the group
	// (KIP-800, Kafka 3.2+).
	Reason *string // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaveGroupRequestMember.
func (v *LeaveGroupRequestMember) Default() {
}

// NewLeaveGroupRequestMember returns a default LeaveGroupRequestMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaveGroupRequestMember() LeaveGroupRequestMember {
	var v LeaveGroupRequestMember
	v.Default()
	return v
}

// LeaveGroupRequest issues a request for a group member to leave the group,
// triggering a group rebalance.
//
// Version 3 changed removed MemberID and added a batch instance+member ID
// way of leaving a group.
type LeaveGroupRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group to leave.
	Group string

	// MemberID is the member that is leaving.
	MemberID string // v0-v2

	// Members are member and group instance IDs to cause to leave a group.
	Members []LeaveGroupRequestMember // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*LeaveGroupRequest) Key() int16                   { return 13 }
func (*LeaveGroupRequest) MaxVersion() int16            { return 5 }
func (v *LeaveGroupRequest) SetVersion(version int16)   { v.Version = version }
func (v *LeaveGroupRequest) GetVersion() int16          { return v.Version }
func (v *LeaveGroupRequest) IsFlexible() bool           { return v.Version >= 4 }
func (v *LeaveGroupRequest) IsGroupCoordinatorRequest() {}
func (v *LeaveGroupRequest) ResponseKind() Response {
	r := &LeaveGroupResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *LeaveGroupRequest) RequestWith(ctx context.Context, r Requestor) (*LeaveGroupResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*LeaveGroupResponse)
	return resp, err
}

func (v *LeaveGroupRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 0 && version <= 2 {
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.Members
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.InstanceID
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if version >= 5 {
				v := v.Reason
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *LeaveGroupRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *LeaveGroupRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *LeaveGroupRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	if version >= 0 && version <= 2 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 3 {
		v := s.Members
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaveGroupRequestMember, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.MemberID = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.InstanceID = v
			}
			if version >= 5 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Reason = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Members = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrLeaveGroupRequest returns a pointer to a default LeaveGroupRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrLeaveGroupRequest() *LeaveGroupRequest {
	var v LeaveGroupRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaveGroupRequest.
func (v *LeaveGroupRequest) Default() {
}

// NewLeaveGroupRequest returns a default LeaveGroupRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaveGroupRequest() LeaveGroupRequest {
	var v LeaveGroupRequest
	v.Default()
	return v
}

type LeaveGroupResponseMember struct {
	MemberID string

	InstanceID *string

	// An individual member's leave error code.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaveGroupResponseMember.
func (v *LeaveGroupResponseMember) Default() {
}

// NewLeaveGroupResponseMember returns a default LeaveGroupResponseMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaveGroupResponseMember() LeaveGroupResponseMember {
	var v LeaveGroupResponseMember
	v.Default()
	return v
}

// LeaveGroupResponse is returned from a LeaveGroupRequest.
type LeaveGroupResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// ErrorCode is the error for the leave group request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to the group (no read perms).
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available
	// (due to the requested broker shutting down or it has not completed startup).
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// UNKNOWN_MEMBER_ID is returned if the member ID is not a part of the group,
	// or if the group is empty or dead.
	ErrorCode int16

	// Members are the list of members and group instance IDs that left the group.
	Members []LeaveGroupResponseMember // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*LeaveGroupResponse) Key() int16                         { return 13 }
func (*LeaveGroupResponse) MaxVersion() int16                  { return 5 }
func (v *LeaveGroupResponse) SetVersion(version int16)         { v.Version = version }
func (v *LeaveGroupResponse) GetVersion() int16                { return v.Version }
func (v *LeaveGroupResponse) IsFlexible() bool                 { return v.Version >= 4 }
func (v *LeaveGroupResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *LeaveGroupResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *LeaveGroupResponse) RequestKind() Request             { return &LeaveGroupRequest{Version: v.Version} }

func (v *LeaveGroupResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 3 {
		v := v.Members
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.InstanceID
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *LeaveGroupResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *LeaveGroupResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *LeaveGroupResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 3 {
		v := s.Members
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]LeaveGroupResponseMember, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.MemberID = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.InstanceID = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Members = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrLeaveGroupResponse returns a pointer to a default LeaveGroupResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrLeaveGroupResponse() *LeaveGroupResponse {
	var v LeaveGroupResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to LeaveGroupResponse.
func (v *LeaveGroupResponse) Default() {
}

// NewLeaveGroupResponse returns a default LeaveGroupResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewLeaveGroupResponse() LeaveGroupResponse {
	var v LeaveGroupResponse
	v.Default()
	return v
}

type SyncGroupRequestGroupAssignment struct {
	// MemberID is the member this assignment is for.
	MemberID string

	// MemberAssignment is the assignment for this member. This is typically
	// of type GroupMemberAssignment.
	MemberAssignment []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SyncGroupRequestGroupAssignment.
func (v *SyncGroupRequestGroupAssignment) Default() {
}

// NewSyncGroupRequestGroupAssignment returns a default SyncGroupRequestGroupAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewSyncGroupRequestGroupAssignment() SyncGroupRequestGroupAssignment {
	var v SyncGroupRequestGroupAssignment
	v.Default()
	return v
}

// SyncGroupRequest is issued by all group members after they receive a a
// response for JoinGroup. The group leader is responsible for sending member
// assignments with the request; all other members do not.
//
// Once the leader sends the group assignment, all members will be replied to.
type SyncGroupRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group ID this sync group is for.
	Group string

	// Generation is the group generation this sync is for.
	Generation int32

	// MemberID is the member ID this member is.
	MemberID string

	// InstanceID is the instance ID of this member in the group (KIP-345).
	InstanceID *string // v3+

	// ProtocolType is the "type" of protocol being used for this group.
	ProtocolType *string // v5+

	// Protocol is the agreed upon protocol name (i.e. "sticky", "range").
	Protocol *string // v5+

	// GroupAssignment, sent only from the group leader, is the topic partition
	// assignment it has decided on for all members.
	GroupAssignment []SyncGroupRequestGroupAssignment

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*SyncGroupRequest) Key() int16                   { return 14 }
func (*SyncGroupRequest) MaxVersion() int16            { return 5 }
func (v *SyncGroupRequest) SetVersion(version int16)   { v.Version = version }
func (v *SyncGroupRequest) GetVersion() int16          { return v.Version }
func (v *SyncGroupRequest) IsFlexible() bool           { return v.Version >= 4 }
func (v *SyncGroupRequest) IsGroupCoordinatorRequest() {}
func (v *SyncGroupRequest) ResponseKind() Response {
	r := &SyncGroupResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *SyncGroupRequest) RequestWith(ctx context.Context, r Requestor) (*SyncGroupResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*SyncGroupResponse)
	return resp, err
}

func (v *SyncGroupRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 5 {
		v := v.ProtocolType
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 5 {
		v := v.Protocol
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.GroupAssignment
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.MemberID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.MemberAssignment
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *SyncGroupRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SyncGroupRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SyncGroupRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		v := b.Int32()
		s.Generation = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	if version >= 5 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ProtocolType = v
	}
	if version >= 5 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Protocol = v
	}
	{
		v := s.GroupAssignment
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]SyncGroupRequestGroupAssignment, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.MemberID = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.MemberAssignment = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.GroupAssignment = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrSyncGroupRequest returns a pointer to a default SyncGroupRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSyncGroupRequest() *SyncGroupRequest {
	var v SyncGroupRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SyncGroupRequest.
func (v *SyncGroupRequest) Default() {
}

// NewSyncGroupRequest returns a default SyncGroupRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewSyncGroupRequest() SyncGroupRequest {
	var v SyncGroupRequest
	v.Default()
	return v
}

// SyncGroupResponse is returned from a SyncGroupRequest.
type SyncGroupResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// ErrorCode is the error for the sync group request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to the group (no read perms).
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// UNKNOWN_MEMBER_ID is returned if the member ID is not a part of the group,
	// or if the group is empty or dead.
	//
	// ILLEGAL_GENERATION is returned if the request's generation ID is invalid.
	//
	// REBALANCE_IN_PROGRESS is returned if the group switched back to rebalancing.
	//
	// UNKNOWN_SERVER_ERROR is returned if the store of the group assignment
	// resulted in a too large message.
	ErrorCode int16

	// ProtocolType is the "type" of protocol being used for this group.
	ProtocolType *string // v5+

	// Protocol is the agreed upon protocol name (i.e. "sticky", "range").
	Protocol *string // v5+

	// MemberAssignment is the assignment for this member that the leader
	// determined.
	MemberAssignment []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*SyncGroupResponse) Key() int16                         { return 14 }
func (*SyncGroupResponse) MaxVersion() int16                  { return 5 }
func (v *SyncGroupResponse) SetVersion(version int16)         { v.Version = version }
func (v *SyncGroupResponse) GetVersion() int16                { return v.Version }
func (v *SyncGroupResponse) IsFlexible() bool                 { return v.Version >= 4 }
func (v *SyncGroupResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *SyncGroupResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *SyncGroupResponse) RequestKind() Request             { return &SyncGroupRequest{Version: v.Version} }

func (v *SyncGroupResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 5 {
		v := v.ProtocolType
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 5 {
		v := v.Protocol
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberAssignment
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *SyncGroupResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SyncGroupResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SyncGroupResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 5 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ProtocolType = v
	}
	if version >= 5 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Protocol = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.MemberAssignment = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrSyncGroupResponse returns a pointer to a default SyncGroupResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSyncGroupResponse() *SyncGroupResponse {
	var v SyncGroupResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SyncGroupResponse.
func (v *SyncGroupResponse) Default() {
}

// NewSyncGroupResponse returns a default SyncGroupResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewSyncGroupResponse() SyncGroupResponse {
	var v SyncGroupResponse
	v.Default()
	return v
}

// DescribeGroupsRequest requests metadata for group IDs.
type DescribeGroupsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Groups is an array of group IDs to request metadata for.
	Groups []string

	// IncludeAuthorizedOperations, introduced in Kafka 2.3.0, specifies
	// whether to include a bitfield of AclOperations this client can perform
	// on the groups. See KIP-430 for more details.
	IncludeAuthorizedOperations bool // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

func (*DescribeGroupsRequest) Key() int16                   { return 15 }
func (*DescribeGroupsRequest) MaxVersion() int16            { return 6 }
func (v *DescribeGroupsRequest) SetVersion(version int16)   { v.Version = version }
func (v *DescribeGroupsRequest) GetVersion() int16          { return v.Version }
func (v *DescribeGroupsRequest) IsFlexible() bool           { return v.Version >= 5 }
func (v *DescribeGroupsRequest) IsGroupCoordinatorRequest() {}
func (v *DescribeGroupsRequest) ResponseKind() Response {
	r := &DescribeGroupsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeGroupsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeGroupsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeGroupsResponse)
	return resp, err
}

func (v *DescribeGroupsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if version >= 3 {
		v := v.IncludeAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeGroupsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeGroupsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeGroupsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	s := v
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.Groups = v
	}
	if version >= 3 {
		v := b.Bool()
		s.IncludeAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeGroupsRequest returns a pointer to a default DescribeGroupsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeGroupsRequest() *DescribeGroupsRequest {
	var v DescribeGroupsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeGroupsRequest.
func (v *DescribeGroupsRequest) Default() {
}

// NewDescribeGroupsRequest returns a default DescribeGroupsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeGroupsRequest() DescribeGroupsRequest {
	var v DescribeGroupsRequest
	v.Default()
	return v
}

type DescribeGroupsResponseGroupMember struct {
	// MemberID is the member ID of a member in this group.
	MemberID string

	// InstanceID is the instance ID of this member in the group (KIP-345).
	InstanceID *string // v4+

	// ClientID is the client ID used by this member.
	ClientID string

	// ClientHost is the host this client is running on.
	ClientHost string

	// ProtocolMetadata is the metadata this member included when joining
	// the group. If using normal (Java-like) consumers, this will be of
	// type GroupMemberMetadata.
	ProtocolMetadata []byte

	// MemberAssignment is the assignment for this member in the group.
	// If using normal (Java-like) consumers, this will be of type
	// GroupMemberAssignment.
	MemberAssignment []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeGroupsResponseGroupMember.
func (v *DescribeGroupsResponseGroupMember) Default() {
}

// NewDescribeGroupsResponseGroupMember returns a default DescribeGroupsResponseGroupMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeGroupsResponseGroupMember() DescribeGroupsResponseGroupMember {
	var v DescribeGroupsResponseGroupMember
	v.Default()
	return v
}

type DescribeGroupsResponseGroup struct {
	// ErrorCode is the error code for an individual group in a request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to describe a group.
	//
	// INVALID_GROUP_ID is returned if the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator for this
	// group is not yet active.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the
	// coordinator for this group.
	//
	// GROUP_ID_NOT_FOUND is returned on v6+ if the group ID is not found (KIP-1043).
	ErrorCode int16

	// ErrorMessage is an optional message with more detail for the error code.
	ErrorMessage *string // v6+

	// Group is the id of this group.
	Group string

	// State is the state this group is in.
	State string

	// ProtocolType is the "type" of protocol being used for this group.
	ProtocolType string

	// Protocol is the agreed upon protocol for all members in this group.
	Protocol string

	// Members contains members in this group.
	Members []DescribeGroupsResponseGroupMember

	// AuthorizedOperations is a bitfield containing which operations the
	// the client is allowed to perform on this group.
	// This is only returned if requested.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32 // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeGroupsResponseGroup.
func (v *DescribeGroupsResponseGroup) Default() {
	v.AuthorizedOperations = -2147483648
}

// NewDescribeGroupsResponseGroup returns a default DescribeGroupsResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeGroupsResponseGroup() DescribeGroupsResponseGroup {
	var v DescribeGroupsResponseGroup
	v.Default()
	return v
}

// DescribeGroupsResponse is returned from a DescribeGroupsRequest.
type DescribeGroupsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// Groups is an array of group metadata.
	Groups []DescribeGroupsResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

func (*DescribeGroupsResponse) Key() int16                         { return 15 }
func (*DescribeGroupsResponse) MaxVersion() int16                  { return 6 }
func (v *DescribeGroupsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DescribeGroupsResponse) GetVersion() int16                { return v.Version }
func (v *DescribeGroupsResponse) IsFlexible() bool                 { return v.Version >= 5 }
func (v *DescribeGroupsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *DescribeGroupsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DescribeGroupsResponse) RequestKind() Request {
	return &DescribeGroupsRequest{Version: v.Version}
}

func (v *DescribeGroupsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if version >= 6 {
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.State
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ProtocolType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Protocol
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Members
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.MemberID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if version >= 4 {
						v := v.InstanceID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ClientID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.ClientHost
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.ProtocolMetadata
						if isFlexible {
							dst = kbin.AppendCompactBytes(dst, v)
						} else {
							dst = kbin.AppendBytes(dst, v)
						}
					}
					{
						v := v.MemberAssignment
						if isFlexible {
							dst = kbin.AppendCompactBytes(dst, v)
						} else {
							dst = kbin.AppendBytes(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if version >= 3 {
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeGroupsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeGroupsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeGroupsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeGroupsResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if version >= 6 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.State = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ProtocolType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Protocol = v
			}
			{
				v := s.Members
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeGroupsResponseGroupMember, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.MemberID = v
					}
					if version >= 4 {
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.InstanceID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientHost = v
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactBytes()
						} else {
							v = b.Bytes()
						}
						s.ProtocolMetadata = v
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactBytes()
						} else {
							v = b.Bytes()
						}
						s.MemberAssignment = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Members = v
			}
			if version >= 3 {
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeGroupsResponse returns a pointer to a default DescribeGroupsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeGroupsResponse() *DescribeGroupsResponse {
	var v DescribeGroupsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeGroupsResponse.
func (v *DescribeGroupsResponse) Default() {
}

// NewDescribeGroupsResponse returns a default DescribeGroupsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeGroupsResponse() DescribeGroupsResponse {
	var v DescribeGroupsResponse
	v.Default()
	return v
}

// ListGroupsRequest issues a request to list all groups.
//
// To list all groups in a cluster, this must be issued to every broker.
type ListGroupsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// StatesFilter, proposed in KIP-518 and introduced in Kafka 2.6.0,
	// allows filtering groups by state, where a state is any of
	// "Preparing", "PreparingRebalance", "CompletingRebalance", "Stable",
	// "Dead", "Empty", "Assigning", "Reconciling", or "NotReady".
	// If empty, all groups are returned.
	StatesFilter []string // v4+

	// TypesFilter, part of KIP-848, filters the types of groups we want
	// to list. If empty, all groups are returned.
	TypesFilter []string // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ListGroupsRequest) Key() int16                 { return 16 }
func (*ListGroupsRequest) MaxVersion() int16          { return 5 }
func (v *ListGroupsRequest) SetVersion(version int16) { v.Version = version }
func (v *ListGroupsRequest) GetVersion() int16        { return v.Version }
func (v *ListGroupsRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *ListGroupsRequest) ResponseKind() Response {
	r := &ListGroupsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ListGroupsRequest) RequestWith(ctx context.Context, r Requestor) (*ListGroupsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ListGroupsResponse)
	return resp, err
}

func (v *ListGroupsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 4 {
		v := v.StatesFilter
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if version >= 5 {
		v := v.TypesFilter
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListGroupsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListGroupsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListGroupsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 4 {
		v := s.StatesFilter
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.StatesFilter = v
	}
	if version >= 5 {
		v := s.TypesFilter
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.TypesFilter = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListGroupsRequest returns a pointer to a default ListGroupsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListGroupsRequest() *ListGroupsRequest {
	var v ListGroupsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListGroupsRequest.
func (v *ListGroupsRequest) Default() {
}

// NewListGroupsRequest returns a default ListGroupsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewListGroupsRequest() ListGroupsRequest {
	var v ListGroupsRequest
	v.Default()
	return v
}

type ListGroupsResponseGroup struct {
	// Group is a Kafka group.
	Group string

	// ProtocolType is the protocol type in use by the group.
	ProtocolType string

	// The group state.
	GroupState string // v4+

	// The group type.
	GroupType string // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListGroupsResponseGroup.
func (v *ListGroupsResponseGroup) Default() {
}

// NewListGroupsResponseGroup returns a default ListGroupsResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewListGroupsResponseGroup() ListGroupsResponseGroup {
	var v ListGroupsResponseGroup
	v.Default()
	return v
}

// ListGroupsResponse is returned from a ListGroupsRequest.
type ListGroupsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// ErrorCode is the error returned for the list groups request.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not yet active.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group manager is loading.
	ErrorCode int16

	// Groups is the list of groups Kafka knows of.
	Groups []ListGroupsResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ListGroupsResponse) Key() int16                         { return 16 }
func (*ListGroupsResponse) MaxVersion() int16                  { return 5 }
func (v *ListGroupsResponse) SetVersion(version int16)         { v.Version = version }
func (v *ListGroupsResponse) GetVersion() int16                { return v.Version }
func (v *ListGroupsResponse) IsFlexible() bool                 { return v.Version >= 3 }
func (v *ListGroupsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *ListGroupsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ListGroupsResponse) RequestKind() Request             { return &ListGroupsRequest{Version: v.Version} }

func (v *ListGroupsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ProtocolType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 4 {
				v := v.GroupState
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 5 {
				v := v.GroupType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListGroupsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListGroupsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListGroupsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListGroupsResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ProtocolType = v
			}
			if version >= 4 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupState = v
			}
			if version >= 5 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupType = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListGroupsResponse returns a pointer to a default ListGroupsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListGroupsResponse() *ListGroupsResponse {
	var v ListGroupsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListGroupsResponse.
func (v *ListGroupsResponse) Default() {
}

// NewListGroupsResponse returns a default ListGroupsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewListGroupsResponse() ListGroupsResponse {
	var v ListGroupsResponse
	v.Default()
	return v
}

// SASLHandshakeRequest begins the sasl authentication flow. Note that Kerberos
// GSSAPI authentication has its own unique flow.
type SASLHandshakeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Mechanism is the mechanism to use for the sasl handshake (e.g., "PLAIN").
	//
	// For version 0, if this mechanism is supported, it is expected that the
	// client immediately authenticates using this mechanism. Note that the
	// only mechanism exclusive to v0 is PLAIN.
	//
	// For version 1, if the mechanism is supported, the next request to issue
	// is SASLHandshakeRequest.
	Mechanism string
}

func (*SASLHandshakeRequest) Key() int16                 { return 17 }
func (*SASLHandshakeRequest) MaxVersion() int16          { return 1 }
func (v *SASLHandshakeRequest) SetVersion(version int16) { v.Version = version }
func (v *SASLHandshakeRequest) GetVersion() int16        { return v.Version }
func (v *SASLHandshakeRequest) IsFlexible() bool         { return false }
func (v *SASLHandshakeRequest) ResponseKind() Response {
	r := &SASLHandshakeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *SASLHandshakeRequest) RequestWith(ctx context.Context, r Requestor) (*SASLHandshakeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*SASLHandshakeResponse)
	return resp, err
}

func (v *SASLHandshakeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Mechanism
		dst = kbin.AppendString(dst, v)
	}
	return dst
}

func (v *SASLHandshakeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SASLHandshakeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SASLHandshakeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Mechanism = v
	}
	return b.Complete()
}

// NewPtrSASLHandshakeRequest returns a pointer to a default SASLHandshakeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSASLHandshakeRequest() *SASLHandshakeRequest {
	var v SASLHandshakeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SASLHandshakeRequest.
func (v *SASLHandshakeRequest) Default() {
}

// NewSASLHandshakeRequest returns a default SASLHandshakeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewSASLHandshakeRequest() SASLHandshakeRequest {
	var v SASLHandshakeRequest
	v.Default()
	return v
}

// SASLHandshakeResponse is returned for a SASLHandshakeRequest.
type SASLHandshakeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is non-zero for ILLEGAL_SASL_STATE, meaning a sasl handshake
	// is not expected at this point in the connection, or UNSUPPORTED_SASL_MECHANISM,
	// meaning the requested mechanism is not supported.
	ErrorCode int16

	// SupportedMechanisms is the list of mechanisms supported if this request
	// errored.
	SupportedMechanisms []string
}

func (*SASLHandshakeResponse) Key() int16                 { return 17 }
func (*SASLHandshakeResponse) MaxVersion() int16          { return 1 }
func (v *SASLHandshakeResponse) SetVersion(version int16) { v.Version = version }
func (v *SASLHandshakeResponse) GetVersion() int16        { return v.Version }
func (v *SASLHandshakeResponse) IsFlexible() bool         { return false }
func (v *SASLHandshakeResponse) RequestKind() Request {
	return &SASLHandshakeRequest{Version: v.Version}
}

func (v *SASLHandshakeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.SupportedMechanisms
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := v[i]
			dst = kbin.AppendString(dst, v)
		}
	}
	return dst
}

func (v *SASLHandshakeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SASLHandshakeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SASLHandshakeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.SupportedMechanisms
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				v = b.UnsafeString()
			} else {
				v = b.String()
			}
			a[i] = v
		}
		v = a
		s.SupportedMechanisms = v
	}
	return b.Complete()
}

// NewPtrSASLHandshakeResponse returns a pointer to a default SASLHandshakeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSASLHandshakeResponse() *SASLHandshakeResponse {
	var v SASLHandshakeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SASLHandshakeResponse.
func (v *SASLHandshakeResponse) Default() {
}

// NewSASLHandshakeResponse returns a default SASLHandshakeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewSASLHandshakeResponse() SASLHandshakeResponse {
	var v SASLHandshakeResponse
	v.Default()
	return v
}

// ApiVersionsRequest requests what API versions a Kafka broker supports.
//
// Note that the client does not know the version a broker supports before
// sending this request.
//
// Before Kafka 2.4.0, if the client used a version larger than the broker
// understands, the broker would reply with an UNSUPPORTED_VERSION error using
// the version 0 message format (i.e., 6 bytes long!). The client should retry
// with a lower version.
//
// After Kafka 2.4.0, if the client uses a version larger than the broker
// understands, the broker replies with UNSUPPORTED_VERSIONS using the version
// 0 message format but additionally includes the api versions the broker does
// support.
type ApiVersionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ClientSoftwareName, added for KIP-511 with Kafka 2.4.0, is the name of the
	// client issuing this request. The broker can use this to enrich its own
	// debugging information of which version of what clients are connected.
	//
	// If using v3, this field is required and must match the following pattern:
	//
	//	[a-zA-Z0-9](?:[a-zA-Z0-9\\-.]*[a-zA-Z0-9])?
	ClientSoftwareName string // v3+

	// ClientSoftwareVersion is the version of the software name in the prior
	// field. It must match the same regex (thus, this is also required).
	ClientSoftwareVersion string // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ApiVersionsRequest) Key() int16                 { return 18 }
func (*ApiVersionsRequest) MaxVersion() int16          { return 4 }
func (v *ApiVersionsRequest) SetVersion(version int16) { v.Version = version }
func (v *ApiVersionsRequest) GetVersion() int16        { return v.Version }
func (v *ApiVersionsRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *ApiVersionsRequest) ResponseKind() Response {
	r := &ApiVersionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ApiVersionsRequest) RequestWith(ctx context.Context, r Requestor) (*ApiVersionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ApiVersionsResponse)
	return resp, err
}

func (v *ApiVersionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 3 {
		v := v.ClientSoftwareName
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.ClientSoftwareVersion
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ApiVersionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ApiVersionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ApiVersionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ClientSoftwareName = v
	}
	if version >= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ClientSoftwareVersion = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrApiVersionsRequest returns a pointer to a default ApiVersionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrApiVersionsRequest() *ApiVersionsRequest {
	var v ApiVersionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ApiVersionsRequest.
func (v *ApiVersionsRequest) Default() {
}

// NewApiVersionsRequest returns a default ApiVersionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewApiVersionsRequest() ApiVersionsRequest {
	var v ApiVersionsRequest
	v.Default()
	return v
}

type ApiVersionsResponseApiKey struct {
	// ApiKey is the key of a message request.
	ApiKey int16

	// MinVersion is the min version a broker supports for an API key.
	MinVersion int16

	// MaxVersion is the max version a broker supports for an API key.
	MaxVersion int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ApiVersionsResponseApiKey.
func (v *ApiVersionsResponseApiKey) Default() {
}

// NewApiVersionsResponseApiKey returns a default ApiVersionsResponseApiKey
// This is a shortcut for creating a struct and calling Default yourself.
func NewApiVersionsResponseApiKey() ApiVersionsResponseApiKey {
	var v ApiVersionsResponseApiKey
	v.Default()
	return v
}

type ApiVersionsResponseSupportedFeature struct {
	// The name of the feature.
	Name string

	// The minimum supported version for the feature.
	MinVersion int16

	// The maximum supported version for the feature.
	MaxVersion int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ApiVersionsResponseSupportedFeature.
func (v *ApiVersionsResponseSupportedFeature) Default() {
}

// NewApiVersionsResponseSupportedFeature returns a default ApiVersionsResponseSupportedFeature
// This is a shortcut for creating a struct and calling Default yourself.
func NewApiVersionsResponseSupportedFeature() ApiVersionsResponseSupportedFeature {
	var v ApiVersionsResponseSupportedFeature
	v.Default()
	return v
}

type ApiVersionsResponseFinalizedFeature struct {
	// The name of the feature.
	Name string

	// The cluster-wide finalized max version level for the feature.
	MaxVersionLevel int16

	// The cluster-wide finalized min version level for the feature.
	MinVersionLevel int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ApiVersionsResponseFinalizedFeature.
func (v *ApiVersionsResponseFinalizedFeature) Default() {
}

// NewApiVersionsResponseFinalizedFeature returns a default ApiVersionsResponseFinalizedFeature
// This is a shortcut for creating a struct and calling Default yourself.
func NewApiVersionsResponseFinalizedFeature() ApiVersionsResponseFinalizedFeature {
	var v ApiVersionsResponseFinalizedFeature
	v.Default()
	return v
}

// ApiVersionsResponse is returned from an ApiVersionsRequest.
type ApiVersionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is UNSUPPORTED_VERSION if the request was issued with a higher
	// version than the broker supports. Before Kafka 2.4.0, if this error is
	// returned, the rest of this struct will be empty.
	//
	// Starting in Kafka 2.4.0 (with version 3), even with an UNSUPPORTED_VERSION
	// error, the broker still replies with the ApiKeys it supports.
	ErrorCode int16

	// ApiKeys is an array corresponding to API keys the broker supports
	// and the range of supported versions for each key.
	ApiKeys []ApiVersionsResponseApiKey

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// Features supported by the broker (see KIP-584).
	SupportedFeatures []ApiVersionsResponseSupportedFeature // tag 0

	// The monotonically increasing epoch for the finalized features information,
	// where -1 indicates an unknown epoch.
	//
	// This field has a default of -1.
	FinalizedFeaturesEpoch int64 // tag 1

	// The list of cluster-wide finalized features (only valid if
	// FinalizedFeaturesEpoch is >= 0).
	FinalizedFeatures []ApiVersionsResponseFinalizedFeature // tag 2

	// Set by a KRaft controller if the required configurations for ZK migration
	// are present
	ZkMigrationReady bool // tag 3

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*ApiVersionsResponse) Key() int16                         { return 18 }
func (*ApiVersionsResponse) MaxVersion() int16                  { return 4 }
func (v *ApiVersionsResponse) SetVersion(version int16)         { v.Version = version }
func (v *ApiVersionsResponse) GetVersion() int16                { return v.Version }
func (v *ApiVersionsResponse) IsFlexible() bool                 { return v.Version >= 3 }
func (v *ApiVersionsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *ApiVersionsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ApiVersionsResponse) RequestKind() Request             { return &ApiVersionsRequest{Version: v.Version} }

func (v *ApiVersionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ApiKeys
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ApiKey
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.MinVersion
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.MaxVersion
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.SupportedFeatures) > 0 {
			toEncode = append(toEncode, 0)
		}
		if v.FinalizedFeaturesEpoch != -1 {
			toEncode = append(toEncode, 1)
		}
		if len(v.FinalizedFeatures) > 0 {
			toEncode = append(toEncode, 2)
		}
		if v.ZkMigrationReady != false {
			toEncode = append(toEncode, 3)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.SupportedFeatures
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fSupportedFeatures:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						{
							v := v.Name
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						{
							v := v.MinVersion
							dst = kbin.AppendInt16(dst, v)
						}
						{
							v := v.MaxVersion
							dst = kbin.AppendInt16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fSupportedFeatures
					}
				}
			case 1:
				{
					v := v.FinalizedFeaturesEpoch
					dst = kbin.AppendUvarint(dst, 1)
					dst = kbin.AppendUvarint(dst, 8)
					dst = kbin.AppendInt64(dst, v)
				}
			case 2:
				{
					v := v.FinalizedFeatures
					dst = kbin.AppendUvarint(dst, 2)
					sized := false
					lenAt := len(dst)
				fFinalizedFeatures:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						{
							v := v.Name
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						{
							v := v.MaxVersionLevel
							dst = kbin.AppendInt16(dst, v)
						}
						{
							v := v.MinVersionLevel
							dst = kbin.AppendInt16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fFinalizedFeatures
					}
				}
			case 3:
				{
					v := v.ZkMigrationReady
					dst = kbin.AppendUvarint(dst, 3)
					dst = kbin.AppendUvarint(dst, 1)
					dst = kbin.AppendBool(dst, v)
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ApiVersionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ApiVersionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ApiVersionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.ApiKeys
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ApiVersionsResponseApiKey, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ApiKey = v
			}
			{
				v := b.Int16()
				s.MinVersion = v
			}
			{
				v := b.Int16()
				s.MaxVersion = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ApiKeys = v
	}
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.SupportedFeatures
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ApiVersionsResponseSupportedFeature, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						v := b.Int16()
						s.MinVersion = v
					}
					{
						v := b.Int16()
						s.MaxVersion = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.SupportedFeatures = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 1:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Int64()
				s.FinalizedFeaturesEpoch = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 2:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.FinalizedFeatures
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ApiVersionsResponseFinalizedFeature, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						v := b.Int16()
						s.MaxVersionLevel = v
					}
					{
						v := b.Int16()
						s.MinVersionLevel = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.FinalizedFeatures = v
				if err := b.Complete(); err != nil {
					return err
				}
			case 3:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := b.Bool()
				s.ZkMigrationReady = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrApiVersionsResponse returns a pointer to a default ApiVersionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrApiVersionsResponse() *ApiVersionsResponse {
	var v ApiVersionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ApiVersionsResponse.
func (v *ApiVersionsResponse) Default() {
	v.FinalizedFeaturesEpoch = -1
}

// NewApiVersionsResponse returns a default ApiVersionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewApiVersionsResponse() ApiVersionsResponse {
	var v ApiVersionsResponse
	v.Default()
	return v
}

type CreateTopicsRequestTopicReplicaAssignment struct {
	// Partition is a partition to create.
	Partition int32

	// Replicas are broker IDs the partition must exist on.
	Replicas []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsRequestTopicReplicaAssignment.
func (v *CreateTopicsRequestTopicReplicaAssignment) Default() {
}

// NewCreateTopicsRequestTopicReplicaAssignment returns a default CreateTopicsRequestTopicReplicaAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsRequestTopicReplicaAssignment() CreateTopicsRequestTopicReplicaAssignment {
	var v CreateTopicsRequestTopicReplicaAssignment
	v.Default()
	return v
}

type CreateTopicsRequestTopicConfig struct {
	// Name is a topic level config key (e.g. segment.bytes).
	Name string

	// Value is a topic level config value (e.g. 1073741824)
	Value *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsRequestTopicConfig.
func (v *CreateTopicsRequestTopicConfig) Default() {
}

// NewCreateTopicsRequestTopicConfig returns a default CreateTopicsRequestTopicConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsRequestTopicConfig() CreateTopicsRequestTopicConfig {
	var v CreateTopicsRequestTopicConfig
	v.Default()
	return v
}

type CreateTopicsRequestTopic struct {
	// Topic is a topic to create.
	Topic string

	// NumPartitions is how many partitions to give a topic. This must
	// be -1 if specifying partitions manually (see ReplicaAssignment)
	// or, starting v4+, to use the broker default partitions.
	NumPartitions int32

	// ReplicationFactor is how many replicas every partition must have.
	// This must be -1 if specifying partitions manually (see ReplicaAssignment)
	// or, starting v4+, to use the broker default replication factor.
	ReplicationFactor int16

	// ReplicaAssignment is an array to manually dicate replicas and their
	// partitions for a topic. If using this, both ReplicationFactor and
	// NumPartitions must be -1.
	ReplicaAssignment []CreateTopicsRequestTopicReplicaAssignment

	// Configs is an array of key value config pairs for a topic.
	// These correspond to Kafka Topic-Level Configs: http://kafka.apache.org/documentation/#topicconfigs.
	Configs []CreateTopicsRequestTopicConfig

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsRequestTopic.
func (v *CreateTopicsRequestTopic) Default() {
}

// NewCreateTopicsRequestTopic returns a default CreateTopicsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsRequestTopic() CreateTopicsRequestTopic {
	var v CreateTopicsRequestTopic
	v.Default()
	return v
}

// CreateTopicsRequest creates Kafka topics.
//
// Version 4, introduced in Kafka 2.4.0, implies client support for
// creation defaults. See KIP-464.
//
// Version 5, also in 2.4.0, returns topic configs in the response (KIP-525).
type CreateTopicsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics is an array of topics to attempt to create.
	Topics []CreateTopicsRequestTopic

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 60000.
	TimeoutMillis int32

	// ValidateOnly is makes this request a dry-run; everything is validated but
	// no topics are actually created.
	ValidateOnly bool // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

func (*CreateTopicsRequest) Key() int16                       { return 19 }
func (*CreateTopicsRequest) MaxVersion() int16                { return 7 }
func (v *CreateTopicsRequest) SetVersion(version int16)       { v.Version = version }
func (v *CreateTopicsRequest) GetVersion() int16              { return v.Version }
func (v *CreateTopicsRequest) IsFlexible() bool               { return v.Version >= 5 }
func (v *CreateTopicsRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *CreateTopicsRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *CreateTopicsRequest) IsAdminRequest()                {}
func (v *CreateTopicsRequest) ResponseKind() Response {
	r := &CreateTopicsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *CreateTopicsRequest) RequestWith(ctx context.Context, r Requestor) (*CreateTopicsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*CreateTopicsResponse)
	return resp, err
}

func (v *CreateTopicsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.NumPartitions
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.ReplicationFactor
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ReplicaAssignment
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.Configs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateTopicsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateTopicsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateTopicsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreateTopicsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.NumPartitions = v
			}
			{
				v := b.Int16()
				s.ReplicationFactor = v
			}
			{
				v := s.ReplicaAssignment
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]CreateTopicsRequestTopicReplicaAssignment, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.ReplicaAssignment = v
			}
			{
				v := s.Configs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]CreateTopicsRequestTopicConfig, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Value = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Configs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if version >= 1 {
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateTopicsRequest returns a pointer to a default CreateTopicsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateTopicsRequest() *CreateTopicsRequest {
	var v CreateTopicsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsRequest.
func (v *CreateTopicsRequest) Default() {
	v.TimeoutMillis = 60000
}

// NewCreateTopicsRequest returns a default CreateTopicsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsRequest() CreateTopicsRequest {
	var v CreateTopicsRequest
	v.Default()
	return v
}

type CreateTopicsResponseTopicConfig struct {
	// Name is the configuration name (e.g. segment.bytes).
	Name string

	// Value is the value for this config key. If the key is sensitive,
	// the value will be null.
	Value *string

	// ReadOnly signifies whether this is not a dynamic config option.
	ReadOnly bool

	// Source is where this config entry is from. See the documentation
	// on DescribeConfigsRequest's Source for more details.
	//
	// This field has a default of -1.
	Source int8

	// IsSensitive signifies whether this is a sensitive config key, which
	// is either a password or an unknown type.
	IsSensitive bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsResponseTopicConfig.
func (v *CreateTopicsResponseTopicConfig) Default() {
	v.Source = -1
}

// NewCreateTopicsResponseTopicConfig returns a default CreateTopicsResponseTopicConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsResponseTopicConfig() CreateTopicsResponseTopicConfig {
	var v CreateTopicsResponseTopicConfig
	v.Default()
	return v
}

type CreateTopicsResponseTopic struct {
	// Topic is the topic this response corresponds to.
	Topic string

	// The unique topic ID.
	TopicID [16]byte // v7+

	// ErrorCode is the error code for an individual topic creation.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized.
	//
	// INVALID_REQUEST is returned if the same topic occurred multiple times
	// in the request.
	//
	// POLICY_VIOLATION is returned if the broker is using a
	// create.topic.policy.class.name that returns a policy violation.
	//
	// INVALID_TOPIC_EXCEPTION if the topic collides with another topic when
	// both topic's names' periods are replaced with underscores (e.g.
	// topic.foo and topic_foo collide).
	//
	// TOPIC_ALREADY_EXISTS is returned if the topic already exists.
	//
	// INVALID_PARTITIONS is returned if the requested number of partitions is
	// <= 0.
	//
	// INVALID_REPLICATION_FACTOR is returned if the requested replication
	// factor is <= 0.
	//
	// INVALID_REPLICA_ASSIGNMENT is returned if not all partitions have the same
	// number of replicas, or duplica replicas are assigned, or the partitions
	// are not consecutive starting from 0.
	//
	// INVALID_CONFIG is returned if the requested topic config is invalid.
	// to create a topic.
	ErrorCode int16

	// ErrorMessage is an informative message if the topic creation failed.
	ErrorMessage *string // v1+

	// ConfigErrorCode is non-zero if configs are unable to be returned.
	//
	// This is the first tagged field, introduced in version 5. As such, it is
	// only possible to be present in v5+.
	ConfigErrorCode int16 // tag 0

	// NumPartitions is how many partitions were created for this topic.
	//
	// This field has a default of -1.
	NumPartitions int32 // v5+

	// ReplicationFactor is how many replicas every partition has for this topic.
	//
	// This field has a default of -1.
	ReplicationFactor int16 // v5+

	// Configs contains this topic's configuration.
	Configs []CreateTopicsResponseTopicConfig // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsResponseTopic.
func (v *CreateTopicsResponseTopic) Default() {
	v.NumPartitions = -1
	v.ReplicationFactor = -1
}

// NewCreateTopicsResponseTopic returns a default CreateTopicsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsResponseTopic() CreateTopicsResponseTopic {
	var v CreateTopicsResponseTopic
	v.Default()
	return v
}

// CreateTopicsResponse is returned from a CreateTopicsRequest.
type CreateTopicsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 3.
	ThrottleMillis int32 // v2+

	// Topics contains responses to the requested topic creations.
	Topics []CreateTopicsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v5+
}

func (*CreateTopicsResponse) Key() int16                         { return 19 }
func (*CreateTopicsResponse) MaxVersion() int16                  { return 7 }
func (v *CreateTopicsResponse) SetVersion(version int16)         { v.Version = version }
func (v *CreateTopicsResponse) GetVersion() int16                { return v.Version }
func (v *CreateTopicsResponse) IsFlexible() bool                 { return v.Version >= 5 }
func (v *CreateTopicsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 3 }
func (v *CreateTopicsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *CreateTopicsResponse) RequestKind() Request             { return &CreateTopicsRequest{Version: v.Version} }

func (v *CreateTopicsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	if version >= 2 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 7 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if version >= 1 {
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if version >= 5 {
				v := v.NumPartitions
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 5 {
				v := v.ReplicationFactor
				dst = kbin.AppendInt16(dst, v)
			}
			if version >= 5 {
				v := v.Configs
				if isFlexible {
					dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
				} else {
					dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ReadOnly
						dst = kbin.AppendBool(dst, v)
					}
					{
						v := v.Source
						dst = kbin.AppendInt8(dst, v)
					}
					{
						v := v.IsSensitive
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				var toEncode []uint32
				if v.ConfigErrorCode != 0 {
					toEncode = append(toEncode, 0)
				}
				dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
				for _, tag := range toEncode {
					switch tag {
					case 0:
						{
							v := v.ConfigErrorCode
							dst = kbin.AppendUvarint(dst, 0)
							dst = kbin.AppendUvarint(dst, 2)
							dst = kbin.AppendInt16(dst, v)
						}
					}
				}
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateTopicsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateTopicsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateTopicsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 5
	_ = isFlexible
	s := v
	if version >= 2 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreateTopicsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 7 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if version >= 1 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if version >= 5 {
				v := b.Int32()
				s.NumPartitions = v
			}
			if version >= 5 {
				v := b.Int16()
				s.ReplicationFactor = v
			}
			if version >= 5 {
				v := s.Configs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if version < 0 || l == 0 {
					a = []CreateTopicsResponseTopicConfig{}
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]CreateTopicsResponseTopicConfig, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Value = v
					}
					{
						v := b.Bool()
						s.ReadOnly = v
					}
					{
						v := b.Int8()
						s.Source = v
					}
					{
						v := b.Bool()
						s.IsSensitive = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Configs = v
			}
			if isFlexible {
				for i := b.Uvarint(); i > 0; i-- {
					switch key := b.Uvarint(); key {
					default:
						s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
					case 0:
						b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
						v := b.Int16()
						s.ConfigErrorCode = v
						if err := b.Complete(); err != nil {
							return err
						}
					}
				}
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateTopicsResponse returns a pointer to a default CreateTopicsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateTopicsResponse() *CreateTopicsResponse {
	var v CreateTopicsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateTopicsResponse.
func (v *CreateTopicsResponse) Default() {
}

// NewCreateTopicsResponse returns a default CreateTopicsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateTopicsResponse() CreateTopicsResponse {
	var v CreateTopicsResponse
	v.Default()
	return v
}

type DeleteTopicsRequestTopic struct {
	Topic *string

	TopicID [16]byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteTopicsRequestTopic.
func (v *DeleteTopicsRequestTopic) Default() {
}

// NewDeleteTopicsRequestTopic returns a default DeleteTopicsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteTopicsRequestTopic() DeleteTopicsRequestTopic {
	var v DeleteTopicsRequestTopic
	v.Default()
	return v
}

// DeleteTopicsRequest deletes Kafka topics.
type DeleteTopicsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics is an array of topics to delete.
	TopicNames []string // v0-v5

	// The name or topic ID of topics to delete.
	Topics []DeleteTopicsRequestTopic // v6+

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 15000.
	TimeoutMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*DeleteTopicsRequest) Key() int16                       { return 20 }
func (*DeleteTopicsRequest) MaxVersion() int16                { return 6 }
func (v *DeleteTopicsRequest) SetVersion(version int16)       { v.Version = version }
func (v *DeleteTopicsRequest) GetVersion() int16              { return v.Version }
func (v *DeleteTopicsRequest) IsFlexible() bool               { return v.Version >= 4 }
func (v *DeleteTopicsRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *DeleteTopicsRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *DeleteTopicsRequest) IsAdminRequest()                {}
func (v *DeleteTopicsRequest) ResponseKind() Response {
	r := &DeleteTopicsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteTopicsRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteTopicsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteTopicsResponse)
	return resp, err
}

func (v *DeleteTopicsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 0 && version <= 5 {
		v := v.TopicNames
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if version >= 6 {
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteTopicsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteTopicsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteTopicsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 0 && version <= 5 {
		v := s.TopicNames
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.TopicNames = v
	}
	if version >= 6 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteTopicsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Topic = v
			}
			{
				v := b.Uuid()
				s.TopicID = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteTopicsRequest returns a pointer to a default DeleteTopicsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteTopicsRequest() *DeleteTopicsRequest {
	var v DeleteTopicsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteTopicsRequest.
func (v *DeleteTopicsRequest) Default() {
	v.TimeoutMillis = 15000
}

// NewDeleteTopicsRequest returns a default DeleteTopicsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteTopicsRequest() DeleteTopicsRequest {
	var v DeleteTopicsRequest
	v.Default()
	return v
}

type DeleteTopicsResponseTopic struct {
	// Topic is the topic requested for deletion.
	Topic *string

	// The topic ID requested for deletion.
	TopicID [16]byte // v6+

	// ErrorCode is the error code returned for an individual topic in
	// deletion request.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to delete a topic.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the topic.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// TOPIC_DELETION_DISABLED is returned for deletion requests version 3+
	// and brokers >= 2.1.0. INVALID_REQUEST is issued for request versions
	// 0-2 against brokers >= 2.1.0. Otherwise, the request hangs until it
	// times out.
	//
	// UNSUPPORTED_VERSION is returned when using topic IDs with a cluster
	// that is not yet Kafka v2.8+.
	//
	// UNKNOWN_TOPIC_ID is returned when using topic IDs to a Kafka cluster
	// v2.8+ and the topic ID is not found.
	ErrorCode int16

	// ErrorMessage is a message for an error.
	ErrorMessage *string // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteTopicsResponseTopic.
func (v *DeleteTopicsResponseTopic) Default() {
}

// NewDeleteTopicsResponseTopic returns a default DeleteTopicsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteTopicsResponseTopic() DeleteTopicsResponseTopic {
	var v DeleteTopicsResponseTopic
	v.Default()
	return v
}

// DeleteTopicsResponse is returned from a DeleteTopicsRequest.
// Version 3 added the TOPIC_DELETION_DISABLED error proposed in KIP-322
// and introduced in Kafka 2.1.0. Prior, the request timed out.
type DeleteTopicsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32 // v1+

	// Topics contains responses for each topic requested for deletion.
	Topics []DeleteTopicsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*DeleteTopicsResponse) Key() int16                         { return 20 }
func (*DeleteTopicsResponse) MaxVersion() int16                  { return 6 }
func (v *DeleteTopicsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DeleteTopicsResponse) GetVersion() int16                { return v.Version }
func (v *DeleteTopicsResponse) IsFlexible() bool                 { return v.Version >= 4 }
func (v *DeleteTopicsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 2 }
func (v *DeleteTopicsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DeleteTopicsResponse) RequestKind() Request             { return &DeleteTopicsRequest{Version: v.Version} }

func (v *DeleteTopicsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 1 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if version < 6 {
					var vv string
					if v != nil {
						vv = *v
					}
					{
						v := vv
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
				} else {
					if isFlexible {
						dst = kbin.AppendCompactNullableString(dst, v)
					} else {
						dst = kbin.AppendNullableString(dst, v)
					}
				}
			}
			if version >= 6 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if version >= 5 {
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteTopicsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteTopicsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteTopicsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteTopicsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v *string
				if version < 6 {
					var vv string
					if isFlexible {
						if unsafe {
							vv = b.UnsafeCompactString()
						} else {
							vv = b.CompactString()
						}
					} else {
						if unsafe {
							vv = b.UnsafeString()
						} else {
							vv = b.String()
						}
					}
					v = &vv
				} else {
					if isFlexible {
						if unsafe {
							v = b.UnsafeCompactNullableString()
						} else {
							v = b.CompactNullableString()
						}
					} else {
						if unsafe {
							v = b.UnsafeNullableString()
						} else {
							v = b.NullableString()
						}
					}
				}
				s.Topic = v
			}
			if version >= 6 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if version >= 5 {
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteTopicsResponse returns a pointer to a default DeleteTopicsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteTopicsResponse() *DeleteTopicsResponse {
	var v DeleteTopicsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteTopicsResponse.
func (v *DeleteTopicsResponse) Default() {
}

// NewDeleteTopicsResponse returns a default DeleteTopicsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteTopicsResponse() DeleteTopicsResponse {
	var v DeleteTopicsResponse
	v.Default()
	return v
}

type DeleteRecordsRequestTopicPartition struct {
	// Partition is a partition to delete records from.
	Partition int32

	// Offset is the offset to set the partition's low watermark (start
	// offset) to. After a successful response, all records before this
	// offset are considered deleted and are no longer readable.
	//
	// To delete all records, use -1, which is mapped to the partition's
	// current high watermark.
	Offset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsRequestTopicPartition.
func (v *DeleteRecordsRequestTopicPartition) Default() {
}

// NewDeleteRecordsRequestTopicPartition returns a default DeleteRecordsRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsRequestTopicPartition() DeleteRecordsRequestTopicPartition {
	var v DeleteRecordsRequestTopicPartition
	v.Default()
	return v
}

type DeleteRecordsRequestTopic struct {
	// Topic is a topic to delete records from.
	Topic string

	// Partitions contains partitions to delete records from.
	Partitions []DeleteRecordsRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsRequestTopic.
func (v *DeleteRecordsRequestTopic) Default() {
}

// NewDeleteRecordsRequestTopic returns a default DeleteRecordsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsRequestTopic() DeleteRecordsRequestTopic {
	var v DeleteRecordsRequestTopic
	v.Default()
	return v
}

// DeleteRecordsRequest is an admin request to delete records from Kafka.
// This was added for KIP-107.
//
// To delete records, Kafka sets the LogStartOffset for partitions to
// the requested offset. All segments whose max partition is before the
// requested offset are deleted, and any records within the segment before
// the requested offset can no longer be read.
//
// This request must be issued to the correct brokers that own the partitions
// you intend to delete records for.
type DeleteRecordsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics contains topics for which to delete records from.
	Topics []DeleteRecordsRequestTopic

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 15000.
	TimeoutMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteRecordsRequest) Key() int16                       { return 21 }
func (*DeleteRecordsRequest) MaxVersion() int16                { return 2 }
func (v *DeleteRecordsRequest) SetVersion(version int16)       { v.Version = version }
func (v *DeleteRecordsRequest) GetVersion() int16              { return v.Version }
func (v *DeleteRecordsRequest) IsFlexible() bool               { return v.Version >= 2 }
func (v *DeleteRecordsRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *DeleteRecordsRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *DeleteRecordsRequest) ResponseKind() Response {
	r := &DeleteRecordsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteRecordsRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteRecordsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteRecordsResponse)
	return resp, err
}

func (v *DeleteRecordsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Offset
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteRecordsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteRecordsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteRecordsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteRecordsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DeleteRecordsRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.Offset = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteRecordsRequest returns a pointer to a default DeleteRecordsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteRecordsRequest() *DeleteRecordsRequest {
	var v DeleteRecordsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsRequest.
func (v *DeleteRecordsRequest) Default() {
	v.TimeoutMillis = 15000
}

// NewDeleteRecordsRequest returns a default DeleteRecordsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsRequest() DeleteRecordsRequest {
	var v DeleteRecordsRequest
	v.Default()
	return v
}

type DeleteRecordsResponseTopicPartition struct {
	// Partition is the partition this response corresponds to.
	Partition int32

	// LowWatermark is the new earliest offset for this partition.
	LowWatermark int64

	// ErrorCode is the error code returned for a given partition in
	// the delete request.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned for all partitions if the
	// client is not authorized to delete records.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned for all partitions that
	// the requested broker does not know of.
	//
	// NOT_LEADER_FOR_PARTITION is returned for partitions that the
	// requested broker is not a leader of.
	//
	// OFFSET_OUT_OF_RANGE is returned if the requested offset is
	// negative or higher than the current high watermark.
	//
	// POLICY_VIOLATION is returned if records cannot be deleted due to
	// broker configuration.
	//
	// KAFKA_STORAGE_EXCEPTION is returned if the partition is in an
	// offline log directory.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsResponseTopicPartition.
func (v *DeleteRecordsResponseTopicPartition) Default() {
}

// NewDeleteRecordsResponseTopicPartition returns a default DeleteRecordsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsResponseTopicPartition() DeleteRecordsResponseTopicPartition {
	var v DeleteRecordsResponseTopicPartition
	v.Default()
	return v
}

type DeleteRecordsResponseTopic struct {
	// Topic is the topic this response corresponds to.
	Topic string

	// Partitions contains responses for each partition in a requested topic
	// in the delete records request.
	Partitions []DeleteRecordsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsResponseTopic.
func (v *DeleteRecordsResponseTopic) Default() {
}

// NewDeleteRecordsResponseTopic returns a default DeleteRecordsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsResponseTopic() DeleteRecordsResponseTopic {
	var v DeleteRecordsResponseTopic
	v.Default()
	return v
}

// DeleteRecordsResponse is returned from a DeleteRecordsRequest.
type DeleteRecordsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Topics contains responses for each topic in the delete records request.
	Topics []DeleteRecordsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteRecordsResponse) Key() int16                         { return 21 }
func (*DeleteRecordsResponse) MaxVersion() int16                  { return 2 }
func (v *DeleteRecordsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DeleteRecordsResponse) GetVersion() int16                { return v.Version }
func (v *DeleteRecordsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *DeleteRecordsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *DeleteRecordsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DeleteRecordsResponse) RequestKind() Request {
	return &DeleteRecordsRequest{Version: v.Version}
}

func (v *DeleteRecordsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LowWatermark
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteRecordsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteRecordsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteRecordsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteRecordsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DeleteRecordsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.LowWatermark = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteRecordsResponse returns a pointer to a default DeleteRecordsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteRecordsResponse() *DeleteRecordsResponse {
	var v DeleteRecordsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteRecordsResponse.
func (v *DeleteRecordsResponse) Default() {
}

// NewDeleteRecordsResponse returns a default DeleteRecordsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteRecordsResponse() DeleteRecordsResponse {
	var v DeleteRecordsResponse
	v.Default()
	return v
}

// InitProducerIDRequest initializes a producer ID for idempotent transactions,
// and if using transactions, a producer epoch. This is the first request
// necessary to begin idempotent producing or transactions.
//
// Note that you do not need to go to a txn coordinator if you are initializing
// a producer id without a transactional id.
type InitProducerIDRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionalID is the ID to use for transactions if using transactions.
	TransactionalID *string

	// TransactionTimeoutMillis is how long a transaction is allowed before
	// EndTxn is required.
	//
	// Note that this timeout only begins on the first AddPartitionsToTxn
	// request.
	TransactionTimeoutMillis int32

	// ProducerID, added for KIP-360, is the current producer ID. This allows
	// the client to potentially recover on UNKNOWN_PRODUCER_ID errors.
	//
	// This field has a default of -1.
	ProducerID int64 // v3+

	// The producer's current epoch. This will be checked against the producer
	// epoch on the broker, and the request will return an error if they do not
	// match. Also added for KIP-360.
	//
	// This field has a default of -1.
	ProducerEpoch int16 // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*InitProducerIDRequest) Key() int16                 { return 22 }
func (*InitProducerIDRequest) MaxVersion() int16          { return 5 }
func (v *InitProducerIDRequest) SetVersion(version int16) { v.Version = version }
func (v *InitProducerIDRequest) GetVersion() int16        { return v.Version }
func (v *InitProducerIDRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *InitProducerIDRequest) IsTxnCoordinatorRequest() {}
func (v *InitProducerIDRequest) ResponseKind() Response {
	r := &InitProducerIDResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *InitProducerIDRequest) RequestWith(ctx context.Context, r Requestor) (*InitProducerIDResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*InitProducerIDResponse)
	return resp, err
}

func (v *InitProducerIDRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.TransactionalID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.TransactionTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 3 {
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 3 {
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *InitProducerIDRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *InitProducerIDRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *InitProducerIDRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.TransactionalID = v
	}
	{
		v := b.Int32()
		s.TransactionTimeoutMillis = v
	}
	if version >= 3 {
		v := b.Int64()
		s.ProducerID = v
	}
	if version >= 3 {
		v := b.Int16()
		s.ProducerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrInitProducerIDRequest returns a pointer to a default InitProducerIDRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrInitProducerIDRequest() *InitProducerIDRequest {
	var v InitProducerIDRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitProducerIDRequest.
func (v *InitProducerIDRequest) Default() {
	v.ProducerID = -1
	v.ProducerEpoch = -1
}

// NewInitProducerIDRequest returns a default InitProducerIDRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitProducerIDRequest() InitProducerIDRequest {
	var v InitProducerIDRequest
	v.Default()
	return v
}

// InitProducerIDResponse is returned for an InitProducerIDRequest.
type InitProducerIDResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// CLUSTER_AUTHORIZATION_FAILED is returned when not using transactions if
	// the client is not authorized for idempotent_write on cluster.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned when using transactions
	// if the client is not authorized to write on transactional_id.
	//
	// INVALID_REQUEST is returned if using transactions and the transactional id
	// is an empty, non-null string
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the coordinator for this
	// transactional ID is still loading.
	//
	// NOT_COORDINATOR is returned if the broker is not the coordinator for
	// this transactional ID.
	//
	// INVALID_TRANSACTION_TIMEOUT is returned if using transactions and the timeout
	// is equal to over over transaction.max.timeout.ms or under 0.
	//
	// CONCURRENT_TRANSACTIONS is returned if there is an ongoing transaction
	// that is completing at the time this init is called.
	ErrorCode int16

	// ProducerID is the next producer ID that Kafka generated. This ID is used
	// to ensure repeated produce requests do not result in duplicate records.
	//
	// This field has a default of -1.
	ProducerID int64

	// ProducerEpoch is the producer epoch to use for transactions.
	ProducerEpoch int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*InitProducerIDResponse) Key() int16                         { return 22 }
func (*InitProducerIDResponse) MaxVersion() int16                  { return 5 }
func (v *InitProducerIDResponse) SetVersion(version int16)         { v.Version = version }
func (v *InitProducerIDResponse) GetVersion() int16                { return v.Version }
func (v *InitProducerIDResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *InitProducerIDResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *InitProducerIDResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *InitProducerIDResponse) RequestKind() Request {
	return &InitProducerIDRequest{Version: v.Version}
}

func (v *InitProducerIDResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *InitProducerIDResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *InitProducerIDResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *InitProducerIDResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrInitProducerIDResponse returns a pointer to a default InitProducerIDResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrInitProducerIDResponse() *InitProducerIDResponse {
	var v InitProducerIDResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitProducerIDResponse.
func (v *InitProducerIDResponse) Default() {
	v.ProducerID = -1
}

// NewInitProducerIDResponse returns a default InitProducerIDResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitProducerIDResponse() InitProducerIDResponse {
	var v InitProducerIDResponse
	v.Default()
	return v
}

type OffsetForLeaderEpochRequestTopicPartition struct {
	// Partition is the number of a partition.
	Partition int32

	// CurrentLeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0,
	// allows brokers to check if the client is fenced (has an out of date
	// leader) or if the client is ahead of the broker.
	//
	// The initial leader epoch can be determined from a MetadataResponse.
	//
	// This field has a default of -1.
	CurrentLeaderEpoch int32 // v2+

	// LeaderEpoch is the epoch to fetch the end offset for.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochRequestTopicPartition.
func (v *OffsetForLeaderEpochRequestTopicPartition) Default() {
	v.CurrentLeaderEpoch = -1
}

// NewOffsetForLeaderEpochRequestTopicPartition returns a default OffsetForLeaderEpochRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochRequestTopicPartition() OffsetForLeaderEpochRequestTopicPartition {
	var v OffsetForLeaderEpochRequestTopicPartition
	v.Default()
	return v
}

type OffsetForLeaderEpochRequestTopic struct {
	// Topic is the name of a topic.
	Topic string

	// Partitions are partitions within a topic to fetch leader epoch offsets for.
	Partitions []OffsetForLeaderEpochRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochRequestTopic.
func (v *OffsetForLeaderEpochRequestTopic) Default() {
}

// NewOffsetForLeaderEpochRequestTopic returns a default OffsetForLeaderEpochRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochRequestTopic() OffsetForLeaderEpochRequestTopic {
	var v OffsetForLeaderEpochRequestTopic
	v.Default()
	return v
}

// OffsetForLeaderEpochRequest requests log end offsets for partitions.
//
// Version 2, proposed in KIP-320 and introduced in Kafka 2.1.0, can be used by
// consumers to perform more accurate offset resetting in the case of data loss.
//
// In support of version 2, this requires DESCRIBE on TOPIC.
type OffsetForLeaderEpochRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ReplicaID, added in support of KIP-392, is the broker ID of the follower,
	// or -1 if this request is from a consumer.
	//
	// This field has a default of -2.
	ReplicaID int32 // v3+

	// Topics are topics to fetch leader epoch offsets for.
	Topics []OffsetForLeaderEpochRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*OffsetForLeaderEpochRequest) Key() int16                 { return 23 }
func (*OffsetForLeaderEpochRequest) MaxVersion() int16          { return 4 }
func (v *OffsetForLeaderEpochRequest) SetVersion(version int16) { v.Version = version }
func (v *OffsetForLeaderEpochRequest) GetVersion() int16        { return v.Version }
func (v *OffsetForLeaderEpochRequest) IsFlexible() bool         { return v.Version >= 4 }
func (v *OffsetForLeaderEpochRequest) ResponseKind() Response {
	r := &OffsetForLeaderEpochResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *OffsetForLeaderEpochRequest) RequestWith(ctx context.Context, r Requestor) (*OffsetForLeaderEpochResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*OffsetForLeaderEpochResponse)
	return resp, err
}

func (v *OffsetForLeaderEpochRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 3 {
		v := v.ReplicaID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 2 {
						v := v.CurrentLeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetForLeaderEpochRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetForLeaderEpochRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetForLeaderEpochRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 3 {
		v := b.Int32()
		s.ReplicaID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetForLeaderEpochRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetForLeaderEpochRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 2 {
						v := b.Int32()
						s.CurrentLeaderEpoch = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetForLeaderEpochRequest returns a pointer to a default OffsetForLeaderEpochRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetForLeaderEpochRequest() *OffsetForLeaderEpochRequest {
	var v OffsetForLeaderEpochRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochRequest.
func (v *OffsetForLeaderEpochRequest) Default() {
	v.ReplicaID = -2
}

// NewOffsetForLeaderEpochRequest returns a default OffsetForLeaderEpochRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochRequest() OffsetForLeaderEpochRequest {
	var v OffsetForLeaderEpochRequest
	v.Default()
	return v
}

type OffsetForLeaderEpochResponseTopicPartition struct {
	// ErrorCode is the error code returned on request failure.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client does not have
	// the necessary permissions to issue this request.
	//
	// KAFKA_STORAGE_ERROR is returned if the partition is offline.
	//
	// NOT_LEADER_FOR_PARTITION is returned if the broker knows of the partition
	// but does not own it.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of the
	// partition.
	//
	// FENCED_LEADER_EPOCH is returned if the client is using a current leader epoch
	// older than the actual leader epoch.
	//
	// UNKNOWN_LEADER_EPOCH if returned if the client is using a current leader epoch
	// that the actual leader does not know of. This could occur when the client
	// has newer metadata than the broker when the broker just became the leader for
	// a replica.
	ErrorCode int16

	// Partition is the partition this response is for.
	Partition int32

	// LeaderEpoch is similar to the requested leader epoch, but pairs with the
	// next field. If the requested leader epoch is unknown, this is -1. If the
	// requested epoch had no records produced during the requested epoch, this
	// is the first prior epoch that had records.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v1+

	// EndOffset is either (1) just past the last recorded offset in the
	// current partition if the broker leader has the same epoch as the
	// leader epoch in the request, or (2) the beginning offset of the next
	// epoch if the leader is past the requested epoch. The second scenario
	// can be seen as equivalent to the first: the beginning offset of the
	// next epoch is just past the final offset of the prior epoch.
	//
	// (2) allows consumers to detect data loss: if the consumer consumed
	// past the end offset that is returned, then the consumer should reset
	// to the returned offset and the consumer knows everything past the end
	// offset was lost.
	//
	// With the prior field, consumers know that at this offset, the broker
	// either has no more records (consumer is caught up), or the broker
	// transitioned to a new epoch.
	//
	// This field has a default of -1.
	EndOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochResponseTopicPartition.
func (v *OffsetForLeaderEpochResponseTopicPartition) Default() {
	v.LeaderEpoch = -1
	v.EndOffset = -1
}

// NewOffsetForLeaderEpochResponseTopicPartition returns a default OffsetForLeaderEpochResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochResponseTopicPartition() OffsetForLeaderEpochResponseTopicPartition {
	var v OffsetForLeaderEpochResponseTopicPartition
	v.Default()
	return v
}

type OffsetForLeaderEpochResponseTopic struct {
	// Topic is the topic this response corresponds to.
	Topic string

	// Partitions are responses to partitions in a topic in the request.
	Partitions []OffsetForLeaderEpochResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochResponseTopic.
func (v *OffsetForLeaderEpochResponseTopic) Default() {
}

// NewOffsetForLeaderEpochResponseTopic returns a default OffsetForLeaderEpochResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochResponseTopic() OffsetForLeaderEpochResponseTopic {
	var v OffsetForLeaderEpochResponseTopic
	v.Default()
	return v
}

// OffsetForLeaderEpochResponse is returned from an OffsetForLeaderEpochRequest.
type OffsetForLeaderEpochResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32 // v2+

	// Topics are responses to topics in the request.
	Topics []OffsetForLeaderEpochResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*OffsetForLeaderEpochResponse) Key() int16                 { return 23 }
func (*OffsetForLeaderEpochResponse) MaxVersion() int16          { return 4 }
func (v *OffsetForLeaderEpochResponse) SetVersion(version int16) { v.Version = version }
func (v *OffsetForLeaderEpochResponse) GetVersion() int16        { return v.Version }
func (v *OffsetForLeaderEpochResponse) IsFlexible() bool         { return v.Version >= 4 }
func (v *OffsetForLeaderEpochResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *OffsetForLeaderEpochResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *OffsetForLeaderEpochResponse) RequestKind() Request {
	return &OffsetForLeaderEpochRequest{Version: v.Version}
}

func (v *OffsetForLeaderEpochResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	if version >= 2 {
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 1 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.EndOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *OffsetForLeaderEpochResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetForLeaderEpochResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetForLeaderEpochResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	if version >= 2 {
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetForLeaderEpochResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetForLeaderEpochResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 1 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Int64()
						s.EndOffset = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrOffsetForLeaderEpochResponse returns a pointer to a default OffsetForLeaderEpochResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetForLeaderEpochResponse() *OffsetForLeaderEpochResponse {
	var v OffsetForLeaderEpochResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetForLeaderEpochResponse.
func (v *OffsetForLeaderEpochResponse) Default() {
}

// NewOffsetForLeaderEpochResponse returns a default OffsetForLeaderEpochResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetForLeaderEpochResponse() OffsetForLeaderEpochResponse {
	var v OffsetForLeaderEpochResponse
	v.Default()
	return v
}

type AddPartitionsToTxnRequestTopic struct {
	// Topic is a topic name.
	Topic string

	// Partitions are partitions within a topic to add as part of the producer
	// side of a transaction.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnRequestTopic.
func (v *AddPartitionsToTxnRequestTopic) Default() {
}

// NewAddPartitionsToTxnRequestTopic returns a default AddPartitionsToTxnRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnRequestTopic() AddPartitionsToTxnRequestTopic {
	var v AddPartitionsToTxnRequestTopic
	v.Default()
	return v
}

type AddPartitionsToTxnRequestTransactionTopic struct {
	Topic string

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnRequestTransactionTopic.
func (v *AddPartitionsToTxnRequestTransactionTopic) Default() {
}

// NewAddPartitionsToTxnRequestTransactionTopic returns a default AddPartitionsToTxnRequestTransactionTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnRequestTransactionTopic() AddPartitionsToTxnRequestTransactionTopic {
	var v AddPartitionsToTxnRequestTransactionTopic
	v.Default()
	return v
}

type AddPartitionsToTxnRequestTransaction struct {
	TransactionalID string

	ProducerID int64

	ProducerEpoch int16

	// VerifyOnly signifies if we want to check if the partition is in the
	// transaction rather than add it.
	VerifyOnly bool

	Topics []AddPartitionsToTxnRequestTransactionTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnRequestTransaction.
func (v *AddPartitionsToTxnRequestTransaction) Default() {
}

// NewAddPartitionsToTxnRequestTransaction returns a default AddPartitionsToTxnRequestTransaction
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnRequestTransaction() AddPartitionsToTxnRequestTransaction {
	var v AddPartitionsToTxnRequestTransaction
	v.Default()
	return v
}

// AddPartitionsToTxnRequest begins the producer side of a transaction for all
// partitions in the request. Before producing any records to a partition in
// the transaction, that partition must have been added to the transaction with
// this request.
//
// Versions 3 and below are exclusively used by clients and versions 4 and
// above are used by brokers.
//
// Version 4 adds VerifyOnly field to check if partitions are already in
// transaction and adds support to batch multiple transactions.
type AddPartitionsToTxnRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionalID is the transactional ID to use for this request.
	TransactionalID string // v0-v3

	// ProducerID is the producer ID of the client for this transactional ID
	// as received from InitProducerID.
	ProducerID int64 // v0-v3

	// ProducerEpoch is the producer epoch of the client for this transactional ID
	// as received from InitProducerID.
	ProducerEpoch int16 // v0-v3

	// Topics are topics to add as part of the producer side of a transaction.
	Topics []AddPartitionsToTxnRequestTopic // v0-v3

	// The list of transactions to add partitions to, for v4+, for brokers only.
	// The fields in this are batch broker requests that duplicate the above fields
	// and thus are undocumented (except VerifyOnly, which is new).
	Transactions []AddPartitionsToTxnRequestTransaction // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*AddPartitionsToTxnRequest) Key() int16                 { return 24 }
func (*AddPartitionsToTxnRequest) MaxVersion() int16          { return 5 }
func (v *AddPartitionsToTxnRequest) SetVersion(version int16) { v.Version = version }
func (v *AddPartitionsToTxnRequest) GetVersion() int16        { return v.Version }
func (v *AddPartitionsToTxnRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *AddPartitionsToTxnRequest) IsTxnCoordinatorRequest() {}
func (v *AddPartitionsToTxnRequest) ResponseKind() Response {
	r := &AddPartitionsToTxnResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AddPartitionsToTxnRequest) RequestWith(ctx context.Context, r Requestor) (*AddPartitionsToTxnResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AddPartitionsToTxnResponse)
	return resp, err
}

func (v *AddPartitionsToTxnRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	if version >= 0 && version <= 3 {
		v := v.TransactionalID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 0 && version <= 3 {
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 0 && version <= 3 {
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 0 && version <= 3 {
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 4 {
		v := v.Transactions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TransactionalID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ProducerID
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.ProducerEpoch
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.VerifyOnly
				dst = kbin.AppendBool(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddPartitionsToTxnRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddPartitionsToTxnRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddPartitionsToTxnRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	if version >= 0 && version <= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TransactionalID = v
	}
	if version >= 0 && version <= 3 {
		v := b.Int64()
		s.ProducerID = v
	}
	if version >= 0 && version <= 3 {
		v := b.Int16()
		s.ProducerEpoch = v
	}
	if version >= 0 && version <= 3 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AddPartitionsToTxnRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 4 {
		v := s.Transactions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AddPartitionsToTxnRequestTransaction, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TransactionalID = v
			}
			{
				v := b.Int64()
				s.ProducerID = v
			}
			{
				v := b.Int16()
				s.ProducerEpoch = v
			}
			{
				v := b.Bool()
				s.VerifyOnly = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AddPartitionsToTxnRequestTransactionTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Transactions = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddPartitionsToTxnRequest returns a pointer to a default AddPartitionsToTxnRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddPartitionsToTxnRequest() *AddPartitionsToTxnRequest {
	var v AddPartitionsToTxnRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnRequest.
func (v *AddPartitionsToTxnRequest) Default() {
}

// NewAddPartitionsToTxnRequest returns a default AddPartitionsToTxnRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnRequest() AddPartitionsToTxnRequest {
	var v AddPartitionsToTxnRequest
	v.Default()
	return v
}

type AddPartitionsToTxnResponseTransactionTopicPartition struct {
	Partition int32

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponseTransactionTopicPartition.
func (v *AddPartitionsToTxnResponseTransactionTopicPartition) Default() {
}

// NewAddPartitionsToTxnResponseTransactionTopicPartition returns a default AddPartitionsToTxnResponseTransactionTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponseTransactionTopicPartition() AddPartitionsToTxnResponseTransactionTopicPartition {
	var v AddPartitionsToTxnResponseTransactionTopicPartition
	v.Default()
	return v
}

type AddPartitionsToTxnResponseTransactionTopic struct {
	Topic string

	Partitions []AddPartitionsToTxnResponseTransactionTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponseTransactionTopic.
func (v *AddPartitionsToTxnResponseTransactionTopic) Default() {
}

// NewAddPartitionsToTxnResponseTransactionTopic returns a default AddPartitionsToTxnResponseTransactionTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponseTransactionTopic() AddPartitionsToTxnResponseTransactionTopic {
	var v AddPartitionsToTxnResponseTransactionTopic
	v.Default()
	return v
}

type AddPartitionsToTxnResponseTransaction struct {
	// The transactional id corresponding to the transaction.
	TransactionalID string

	Topics []AddPartitionsToTxnResponseTransactionTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponseTransaction.
func (v *AddPartitionsToTxnResponseTransaction) Default() {
}

// NewAddPartitionsToTxnResponseTransaction returns a default AddPartitionsToTxnResponseTransaction
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponseTransaction() AddPartitionsToTxnResponseTransaction {
	var v AddPartitionsToTxnResponseTransaction
	v.Default()
	return v
}

type AddPartitionsToTxnResponseTopicPartition struct {
	// Partition is a partition being responded to.
	Partition int32

	// ErrorCode is any error for this topic/partition commit.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned if the client is
	// not authorized for write with transactional IDs with the requested
	// transactional ID.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned for all topics that the client
	// is not authorized to write to.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned for all topics or partitions
	// that the broker does not know of.
	//
	// OPERATION_NOT_ATTEMPTED is returned if any of the above errors occur
	// for all partitions that did not have the above errors.
	//
	// INVALID_REQUEST is returned if the transactional ID is invalid.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the coordinator for this
	// transactional ID is still loading.
	//
	// NOT_COORDINATOR is returned if the broker is not the coordinator for
	// this transactional ID.
	//
	// INVALID_PRODUCER_ID_MAPPING is returned if the produce request used
	// a producer ID that is not tied to the transactional ID (i.e., mismatch
	// from what was returned from InitProducerID).
	//
	// INVALID_PRODUCER_EPOCH is returned if the requested epoch does not match
	// the broker epoch for this transactional ID.
	//
	// CONCURRENT_TRANSACTIONS is returned if there is an ongoing transaction for
	// this transactional ID, if the producer ID and epoch matches the broker's.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponseTopicPartition.
func (v *AddPartitionsToTxnResponseTopicPartition) Default() {
}

// NewAddPartitionsToTxnResponseTopicPartition returns a default AddPartitionsToTxnResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponseTopicPartition() AddPartitionsToTxnResponseTopicPartition {
	var v AddPartitionsToTxnResponseTopicPartition
	v.Default()
	return v
}

type AddPartitionsToTxnResponseTopic struct {
	// Topic is a topic being responded to.
	Topic string

	// Partitions are responses to partitions in the request.
	Partitions []AddPartitionsToTxnResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponseTopic.
func (v *AddPartitionsToTxnResponseTopic) Default() {
}

// NewAddPartitionsToTxnResponseTopic returns a default AddPartitionsToTxnResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponseTopic() AddPartitionsToTxnResponseTopic {
	var v AddPartitionsToTxnResponseTopic
	v.Default()
	return v
}

// AddPartitionsToTxnResponse is a response to an AddPartitionsToTxnRequest.
type AddPartitionsToTxnResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// The response top level error code.
	ErrorCode int16 // v4+

	// Results categorized by transactional ID, v4+ only, for brokers only.
	// The fields duplicate v3 and below fields (except TransactionalID) and
	// are left undocumented.
	Transactions []AddPartitionsToTxnResponseTransaction // v4+

	// Topics are responses to topics in the request.
	Topics []AddPartitionsToTxnResponseTopic // v0-v3

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*AddPartitionsToTxnResponse) Key() int16                 { return 24 }
func (*AddPartitionsToTxnResponse) MaxVersion() int16          { return 5 }
func (v *AddPartitionsToTxnResponse) SetVersion(version int16) { v.Version = version }
func (v *AddPartitionsToTxnResponse) GetVersion() int16        { return v.Version }
func (v *AddPartitionsToTxnResponse) IsFlexible() bool         { return v.Version >= 3 }
func (v *AddPartitionsToTxnResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *AddPartitionsToTxnResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AddPartitionsToTxnResponse) RequestKind() Request {
	return &AddPartitionsToTxnRequest{Version: v.Version}
}

func (v *AddPartitionsToTxnResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 4 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 4 {
		v := v.Transactions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TransactionalID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ErrorCode
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 0 && version <= 3 {
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddPartitionsToTxnResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddPartitionsToTxnResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddPartitionsToTxnResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 4 {
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 4 {
		v := s.Transactions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AddPartitionsToTxnResponseTransaction, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TransactionalID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AddPartitionsToTxnResponseTransactionTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]AddPartitionsToTxnResponseTransactionTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int16()
								s.ErrorCode = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Transactions = v
	}
	if version >= 0 && version <= 3 {
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AddPartitionsToTxnResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AddPartitionsToTxnResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddPartitionsToTxnResponse returns a pointer to a default AddPartitionsToTxnResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddPartitionsToTxnResponse() *AddPartitionsToTxnResponse {
	var v AddPartitionsToTxnResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddPartitionsToTxnResponse.
func (v *AddPartitionsToTxnResponse) Default() {
}

// NewAddPartitionsToTxnResponse returns a default AddPartitionsToTxnResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddPartitionsToTxnResponse() AddPartitionsToTxnResponse {
	var v AddPartitionsToTxnResponse
	v.Default()
	return v
}

// AddOffsetsToTxnRequest is a request that ties produced records to what group
// is being consumed for the transaction.
//
// This request must be called before TxnOffsetCommitRequest.
//
// Internally, this request simply adds the __consumer_offsets topic as a
// partition for this transaction with AddPartitionsToTxn for the partition
// in that topic that contains the group.
type AddOffsetsToTxnRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionalID is the transactional ID to use for this request.
	TransactionalID string

	// ProducerID is the producer ID of the client for this transactional ID
	// as received from InitProducerID.
	ProducerID int64

	// ProducerEpoch is the producer epoch of the client for this transactional ID
	// as received from InitProducerID.
	ProducerEpoch int16

	// Group is the group to tie this transaction to.
	Group string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*AddOffsetsToTxnRequest) Key() int16                 { return 25 }
func (*AddOffsetsToTxnRequest) MaxVersion() int16          { return 4 }
func (v *AddOffsetsToTxnRequest) SetVersion(version int16) { v.Version = version }
func (v *AddOffsetsToTxnRequest) GetVersion() int16        { return v.Version }
func (v *AddOffsetsToTxnRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *AddOffsetsToTxnRequest) IsTxnCoordinatorRequest() {}
func (v *AddOffsetsToTxnRequest) ResponseKind() Response {
	r := &AddOffsetsToTxnResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AddOffsetsToTxnRequest) RequestWith(ctx context.Context, r Requestor) (*AddOffsetsToTxnResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AddOffsetsToTxnResponse)
	return resp, err
}

func (v *AddOffsetsToTxnRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.TransactionalID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddOffsetsToTxnRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddOffsetsToTxnRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddOffsetsToTxnRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TransactionalID = v
	}
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddOffsetsToTxnRequest returns a pointer to a default AddOffsetsToTxnRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddOffsetsToTxnRequest() *AddOffsetsToTxnRequest {
	var v AddOffsetsToTxnRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddOffsetsToTxnRequest.
func (v *AddOffsetsToTxnRequest) Default() {
}

// NewAddOffsetsToTxnRequest returns a default AddOffsetsToTxnRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddOffsetsToTxnRequest() AddOffsetsToTxnRequest {
	var v AddOffsetsToTxnRequest
	v.Default()
	return v
}

// AddOffsetsToTxnResponse is a response to an AddOffsetsToTxnRequest.
type AddOffsetsToTxnResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// ErrorCode is any error for this topic/partition commit.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned if the client is
	// not authorized for write with transactional IDs with the requested
	// transactional ID.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to read group with the requested group id.
	//
	// This also can return any error that AddPartitionsToTxn returns.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*AddOffsetsToTxnResponse) Key() int16                 { return 25 }
func (*AddOffsetsToTxnResponse) MaxVersion() int16          { return 4 }
func (v *AddOffsetsToTxnResponse) SetVersion(version int16) { v.Version = version }
func (v *AddOffsetsToTxnResponse) GetVersion() int16        { return v.Version }
func (v *AddOffsetsToTxnResponse) IsFlexible() bool         { return v.Version >= 3 }
func (v *AddOffsetsToTxnResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 1 }
func (v *AddOffsetsToTxnResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AddOffsetsToTxnResponse) RequestKind() Request {
	return &AddOffsetsToTxnRequest{Version: v.Version}
}

func (v *AddOffsetsToTxnResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddOffsetsToTxnResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddOffsetsToTxnResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddOffsetsToTxnResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddOffsetsToTxnResponse returns a pointer to a default AddOffsetsToTxnResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddOffsetsToTxnResponse() *AddOffsetsToTxnResponse {
	var v AddOffsetsToTxnResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddOffsetsToTxnResponse.
func (v *AddOffsetsToTxnResponse) Default() {
}

// NewAddOffsetsToTxnResponse returns a default AddOffsetsToTxnResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddOffsetsToTxnResponse() AddOffsetsToTxnResponse {
	var v AddOffsetsToTxnResponse
	v.Default()
	return v
}

// EndTxnRequest ends a transaction. This should be called after
// TxnOffsetCommitRequest.
type EndTxnRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionalID is the transactional ID to use for this request.
	TransactionalID string

	// ProducerID is the producer ID of the client for this transactional ID
	// as received from InitProducerID.
	ProducerID int64

	// ProducerEpoch is the producer epoch of the client for this transactional ID
	// as received from InitProducerID.
	ProducerEpoch int16

	// Commit is whether to commit this transaction: true for yes, false for abort.
	Commit bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*EndTxnRequest) Key() int16                 { return 26 }
func (*EndTxnRequest) MaxVersion() int16          { return 5 }
func (v *EndTxnRequest) SetVersion(version int16) { v.Version = version }
func (v *EndTxnRequest) GetVersion() int16        { return v.Version }
func (v *EndTxnRequest) IsFlexible() bool         { return v.Version >= 3 }
func (v *EndTxnRequest) IsTxnCoordinatorRequest() {}
func (v *EndTxnRequest) ResponseKind() Response {
	r := &EndTxnResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *EndTxnRequest) RequestWith(ctx context.Context, r Requestor) (*EndTxnResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*EndTxnResponse)
	return resp, err
}

func (v *EndTxnRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.TransactionalID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Commit
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EndTxnRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EndTxnRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EndTxnRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TransactionalID = v
	}
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	{
		v := b.Bool()
		s.Commit = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrEndTxnRequest returns a pointer to a default EndTxnRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEndTxnRequest() *EndTxnRequest {
	var v EndTxnRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndTxnRequest.
func (v *EndTxnRequest) Default() {
}

// NewEndTxnRequest returns a default EndTxnRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndTxnRequest() EndTxnRequest {
	var v EndTxnRequest
	v.Default()
	return v
}

// EndTxnResponse is a response for an EndTxnRequest.
type EndTxnResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// ErrorCode is any error for this topic/partition commit.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned if the client is
	// not authorized for write with transactional IDs with the requested
	// transactional ID.
	//
	// INVALID_REQUEST is returned if the transactional ID is invalid.
	//
	// INVALID_PRODUCER_ID_MAPPING is returned if the produce request used
	// a producer ID that is not tied to the transactional ID (i.e., mismatch
	// from what was returned from InitProducerID).
	//
	// INVALID_PRODUCER_EPOCH is returned if the requested epoch does not match
	// the broker epoch for this transactional ID.
	//
	// CONCURRENT_TRANSACTIONS is returned if there is an ongoing transaction for
	// this transactional ID, if the producer ID and epoch matches the broker's.
	//
	// INVALID_TXN_STATE is returned if this request is attempted at the wrong
	// time (given the order of how transaction requests should go).
	ErrorCode int16

	// Kafka 4.0+ returns the producer ID that the producer should use on the
	// *next* transaction. This is the same as the ID used in the request, but
	// is bumped if the epoch overflows. See KIP-890.
	//
	// This field has a default of -1.
	ProducerID int64 // v5+

	// Kafka 4.0+ returns the producer epoch that the producer should use on the
	// *next* transaction. See KIP-890.
	//
	// This field has a default of -1.
	ProducerEpoch int16 // v5+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*EndTxnResponse) Key() int16                         { return 26 }
func (*EndTxnResponse) MaxVersion() int16                  { return 5 }
func (v *EndTxnResponse) SetVersion(version int16)         { v.Version = version }
func (v *EndTxnResponse) GetVersion() int16                { return v.Version }
func (v *EndTxnResponse) IsFlexible() bool                 { return v.Version >= 3 }
func (v *EndTxnResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *EndTxnResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *EndTxnResponse) RequestKind() Request             { return &EndTxnRequest{Version: v.Version} }

func (v *EndTxnResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 5 {
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 5 {
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EndTxnResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EndTxnResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EndTxnResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 5 {
		v := b.Int64()
		s.ProducerID = v
	}
	if version >= 5 {
		v := b.Int16()
		s.ProducerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrEndTxnResponse returns a pointer to a default EndTxnResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEndTxnResponse() *EndTxnResponse {
	var v EndTxnResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndTxnResponse.
func (v *EndTxnResponse) Default() {
	v.ProducerID = -1
	v.ProducerEpoch = -1
}

// NewEndTxnResponse returns a default EndTxnResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndTxnResponse() EndTxnResponse {
	var v EndTxnResponse
	v.Default()
	return v
}

type WriteTxnMarkersRequestMarkerTopic struct {
	// Topic is the name of the topic to write markers for.
	Topic string

	// Partitions contains partitions to write markers for.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersRequestMarkerTopic.
func (v *WriteTxnMarkersRequestMarkerTopic) Default() {
}

// NewWriteTxnMarkersRequestMarkerTopic returns a default WriteTxnMarkersRequestMarkerTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersRequestMarkerTopic() WriteTxnMarkersRequestMarkerTopic {
	var v WriteTxnMarkersRequestMarkerTopic
	v.Default()
	return v
}

type WriteTxnMarkersRequestMarker struct {
	// ProducerID is the current producer ID to use when writing a marker.
	ProducerID int64

	// ProducerEpoch is the current producer epoch to use when writing a
	// marker.
	ProducerEpoch int16

	// Committed is true if this marker is for a committed transaction,
	// otherwise false if this is for an aborted transaction.
	Committed bool

	// Topics contains the topics we are writing markers for.
	Topics []WriteTxnMarkersRequestMarkerTopic

	// CoordinatorEpoch is the current epoch of the transaction coordinator we
	// are writing a marker to. This is used to detect fenced writers.
	CoordinatorEpoch int32

	// TransactionVersion is the transaction version of the marker.
	// 0/1 = legacy (TV0/TV1), 2 = TV2 etc.
	TransactionVersion int8 // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersRequestMarker.
func (v *WriteTxnMarkersRequestMarker) Default() {
}

// NewWriteTxnMarkersRequestMarker returns a default WriteTxnMarkersRequestMarker
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersRequestMarker() WriteTxnMarkersRequestMarker {
	var v WriteTxnMarkersRequestMarker
	v.Default()
	return v
}

// WriteTxnMarkersRequest is a broker-to-broker request that Kafka uses to
// finish transactions.
// Version 2, introduced in Kafka 4.2, adds TransactionVersion (KIP-1228).
type WriteTxnMarkersRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Markers contains transactional markers to be written.
	Markers []WriteTxnMarkersRequestMarker

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*WriteTxnMarkersRequest) Key() int16                 { return 27 }
func (*WriteTxnMarkersRequest) MaxVersion() int16          { return 2 }
func (v *WriteTxnMarkersRequest) SetVersion(version int16) { v.Version = version }
func (v *WriteTxnMarkersRequest) GetVersion() int16        { return v.Version }
func (v *WriteTxnMarkersRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *WriteTxnMarkersRequest) ResponseKind() Response {
	r := &WriteTxnMarkersResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *WriteTxnMarkersRequest) RequestWith(ctx context.Context, r Requestor) (*WriteTxnMarkersResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*WriteTxnMarkersResponse)
	return resp, err
}

func (v *WriteTxnMarkersRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Markers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ProducerID
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.ProducerEpoch
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.Committed
				dst = kbin.AppendBool(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.CoordinatorEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			if version >= 2 {
				v := v.TransactionVersion
				dst = kbin.AppendInt8(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *WriteTxnMarkersRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *WriteTxnMarkersRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *WriteTxnMarkersRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := s.Markers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]WriteTxnMarkersRequestMarker, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int64()
				s.ProducerID = v
			}
			{
				v := b.Int16()
				s.ProducerEpoch = v
			}
			{
				v := b.Bool()
				s.Committed = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]WriteTxnMarkersRequestMarkerTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			{
				v := b.Int32()
				s.CoordinatorEpoch = v
			}
			if version >= 2 {
				v := b.Int8()
				s.TransactionVersion = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Markers = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrWriteTxnMarkersRequest returns a pointer to a default WriteTxnMarkersRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrWriteTxnMarkersRequest() *WriteTxnMarkersRequest {
	var v WriteTxnMarkersRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersRequest.
func (v *WriteTxnMarkersRequest) Default() {
}

// NewWriteTxnMarkersRequest returns a default WriteTxnMarkersRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersRequest() WriteTxnMarkersRequest {
	var v WriteTxnMarkersRequest
	v.Default()
	return v
}

type WriteTxnMarkersResponseMarkerTopicPartition struct {
	// Partition is the partition this result is for.
	Partition int32

	// ErrorCode is non-nil if writing the transansactional marker for this
	// partition errored.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if the user does not have
	// CLUSTER_ACTION on CLUSTER.
	//
	// NOT_LEADER_OR_FOLLOWER is returned if the broker receiving this
	// request is not the leader of the partition.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the topic or partition is
	// not known to exist.
	//
	// INVALID_PRODUCER_EPOCH is returned if the cluster epoch is provided
	// and the provided epoch does not match.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersResponseMarkerTopicPartition.
func (v *WriteTxnMarkersResponseMarkerTopicPartition) Default() {
}

// NewWriteTxnMarkersResponseMarkerTopicPartition returns a default WriteTxnMarkersResponseMarkerTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersResponseMarkerTopicPartition() WriteTxnMarkersResponseMarkerTopicPartition {
	var v WriteTxnMarkersResponseMarkerTopicPartition
	v.Default()
	return v
}

type WriteTxnMarkersResponseMarkerTopic struct {
	// Topic is the topic these results are for.
	Topic string

	// Partitions contains per-partition results for the write markers
	// request.
	Partitions []WriteTxnMarkersResponseMarkerTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersResponseMarkerTopic.
func (v *WriteTxnMarkersResponseMarkerTopic) Default() {
}

// NewWriteTxnMarkersResponseMarkerTopic returns a default WriteTxnMarkersResponseMarkerTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersResponseMarkerTopic() WriteTxnMarkersResponseMarkerTopic {
	var v WriteTxnMarkersResponseMarkerTopic
	v.Default()
	return v
}

type WriteTxnMarkersResponseMarker struct {
	// ProducerID is the producer ID these results are for (from the input
	// request).
	ProducerID int64

	// Topics contains the results for the write markers request.
	Topics []WriteTxnMarkersResponseMarkerTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersResponseMarker.
func (v *WriteTxnMarkersResponseMarker) Default() {
}

// NewWriteTxnMarkersResponseMarker returns a default WriteTxnMarkersResponseMarker
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersResponseMarker() WriteTxnMarkersResponseMarker {
	var v WriteTxnMarkersResponseMarker
	v.Default()
	return v
}

// WriteTxnMarkersResponse is a response to a WriteTxnMarkersRequest.
type WriteTxnMarkersResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Markers contains results for writing transactional markers.
	Markers []WriteTxnMarkersResponseMarker

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*WriteTxnMarkersResponse) Key() int16                 { return 27 }
func (*WriteTxnMarkersResponse) MaxVersion() int16          { return 2 }
func (v *WriteTxnMarkersResponse) SetVersion(version int16) { v.Version = version }
func (v *WriteTxnMarkersResponse) GetVersion() int16        { return v.Version }
func (v *WriteTxnMarkersResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *WriteTxnMarkersResponse) RequestKind() Request {
	return &WriteTxnMarkersRequest{Version: v.Version}
}

func (v *WriteTxnMarkersResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Markers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ProducerID
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ErrorCode
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *WriteTxnMarkersResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *WriteTxnMarkersResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *WriteTxnMarkersResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := s.Markers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]WriteTxnMarkersResponseMarker, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int64()
				s.ProducerID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]WriteTxnMarkersResponseMarkerTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]WriteTxnMarkersResponseMarkerTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int16()
								s.ErrorCode = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Markers = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrWriteTxnMarkersResponse returns a pointer to a default WriteTxnMarkersResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrWriteTxnMarkersResponse() *WriteTxnMarkersResponse {
	var v WriteTxnMarkersResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteTxnMarkersResponse.
func (v *WriteTxnMarkersResponse) Default() {
}

// NewWriteTxnMarkersResponse returns a default WriteTxnMarkersResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteTxnMarkersResponse() WriteTxnMarkersResponse {
	var v WriteTxnMarkersResponse
	v.Default()
	return v
}

type TxnOffsetCommitRequestTopicPartition struct {
	// Partition is a partition to add for a pending commit.
	Partition int32

	// Offset is the offset within partition to commit once EndTxnRequest is
	// called (with commit; abort obviously aborts).
	Offset int64

	// LeaderEpoch, proposed in KIP-320 and introduced in Kafka 2.1.0,
	// allows brokers to check if the client is fenced (has an out of date
	// leader) or is using an unknown leader.
	//
	// The initial leader epoch can be determined from a MetadataResponse.
	// To skip log truncation checking, use -1.
	//
	// This field has a default of -1.
	LeaderEpoch int32 // v2+

	// Metadata is optional metadata the client wants to include with this
	// commit.
	Metadata *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitRequestTopicPartition.
func (v *TxnOffsetCommitRequestTopicPartition) Default() {
	v.LeaderEpoch = -1
}

// NewTxnOffsetCommitRequestTopicPartition returns a default TxnOffsetCommitRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitRequestTopicPartition() TxnOffsetCommitRequestTopicPartition {
	var v TxnOffsetCommitRequestTopicPartition
	v.Default()
	return v
}

type TxnOffsetCommitRequestTopic struct {
	// Topic is a topic to add for a pending commit.
	Topic string

	// Partitions are partitions to add for pending commits.
	Partitions []TxnOffsetCommitRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitRequestTopic.
func (v *TxnOffsetCommitRequestTopic) Default() {
}

// NewTxnOffsetCommitRequestTopic returns a default TxnOffsetCommitRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitRequestTopic() TxnOffsetCommitRequestTopic {
	var v TxnOffsetCommitRequestTopic
	v.Default()
	return v
}

// TxnOffsetCommitRequest sends offsets that are a part of this transaction
// to be committed once the transaction itself finishes. This effectively
// replaces OffsetCommitRequest for when using transactions.
type TxnOffsetCommitRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TransactionalID is the transactional ID to use for this request.
	TransactionalID string

	// Group is the group consumed in this transaction and to be used for
	// committing.
	Group string

	// ProducerID is the producer ID of the client for this transactional ID
	// as received from InitProducerID.
	ProducerID int64

	// ProducerEpoch is the producer epoch of the client for this transactional ID
	// as received from InitProducerID.
	ProducerEpoch int16

	// Generation is the group generation this transactional offset commit request is for.
	//
	// This field has a default of -1.
	Generation int32 // v3+

	// MemberID is the member ID this member is for.
	MemberID string // v3+

	// InstanceID is the instance ID of this member in the group (KIP-345, KIP-447).
	InstanceID *string // v3+

	// Topics are topics to add for pending commits.
	Topics []TxnOffsetCommitRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*TxnOffsetCommitRequest) Key() int16                   { return 28 }
func (*TxnOffsetCommitRequest) MaxVersion() int16            { return 5 }
func (v *TxnOffsetCommitRequest) SetVersion(version int16)   { v.Version = version }
func (v *TxnOffsetCommitRequest) GetVersion() int16          { return v.Version }
func (v *TxnOffsetCommitRequest) IsFlexible() bool           { return v.Version >= 3 }
func (v *TxnOffsetCommitRequest) IsGroupCoordinatorRequest() {}
func (v *TxnOffsetCommitRequest) ResponseKind() Response {
	r := &TxnOffsetCommitResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *TxnOffsetCommitRequest) RequestWith(ctx context.Context, r Requestor) (*TxnOffsetCommitResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*TxnOffsetCommitResponse)
	return resp, err
}

func (v *TxnOffsetCommitRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.TransactionalID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.ProducerID
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerEpoch
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 3 {
		v := v.Generation
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 3 {
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Offset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 2 {
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Metadata
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *TxnOffsetCommitRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *TxnOffsetCommitRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *TxnOffsetCommitRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TransactionalID = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		v := b.Int64()
		s.ProducerID = v
	}
	{
		v := b.Int16()
		s.ProducerEpoch = v
	}
	if version >= 3 {
		v := b.Int32()
		s.Generation = v
	}
	if version >= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TxnOffsetCommitRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]TxnOffsetCommitRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.Offset = v
					}
					if version >= 2 {
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Metadata = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrTxnOffsetCommitRequest returns a pointer to a default TxnOffsetCommitRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrTxnOffsetCommitRequest() *TxnOffsetCommitRequest {
	var v TxnOffsetCommitRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitRequest.
func (v *TxnOffsetCommitRequest) Default() {
	v.Generation = -1
}

// NewTxnOffsetCommitRequest returns a default TxnOffsetCommitRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitRequest() TxnOffsetCommitRequest {
	var v TxnOffsetCommitRequest
	v.Default()
	return v
}

type TxnOffsetCommitResponseTopicPartition struct {
	// Partition is the partition this response is for.
	Partition int32

	// ErrorCode is any error for this topic/partition commit.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned if the client is
	// not authorized for write with transactional IDs with the requested
	// transactional ID.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to read group with the requested group id.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned for all topics that the client
	// is not authorized to read.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned for all topics or partitions
	// that the broker does not know of.
	//
	// INVALID_GROUP_ID is returned if the requested group does not exist.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the broker is not yet fully
	// started or is shutting down, or if the group was just deleted or is
	// migrating to another broker.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is still loading.
	//
	// NOT_COORDINATOR is returned if the broker is not the coordinator for
	// the group.
	//
	// FENCED_INSTANCE_ID is returned if the member is fenced (another newer
	// transactional member is using the same instance ID).
	//
	// UNKNOWN_MEMBER_ID is returned if the consumer group does not know of
	// this member.
	//
	// ILLEGAL_GENERATION is returned if the consumer group's generation is
	// different than the requested generation.
	//
	// OFFSET_METADATA_TOO_LARGE is returned if the commit metadata is too
	// large.
	//
	// REBALANCE_IN_PROGRESS is returned if the group is completing a rebalance.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitResponseTopicPartition.
func (v *TxnOffsetCommitResponseTopicPartition) Default() {
}

// NewTxnOffsetCommitResponseTopicPartition returns a default TxnOffsetCommitResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitResponseTopicPartition() TxnOffsetCommitResponseTopicPartition {
	var v TxnOffsetCommitResponseTopicPartition
	v.Default()
	return v
}

type TxnOffsetCommitResponseTopic struct {
	// Topic is the topic this response is for.
	Topic string

	// Partitions contains responses to the partitions in this topic.
	Partitions []TxnOffsetCommitResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitResponseTopic.
func (v *TxnOffsetCommitResponseTopic) Default() {
}

// NewTxnOffsetCommitResponseTopic returns a default TxnOffsetCommitResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitResponseTopic() TxnOffsetCommitResponseTopic {
	var v TxnOffsetCommitResponseTopic
	v.Default()
	return v
}

// TxnOffsetCommitResponse is a response to a TxnOffsetCommitRequest.
type TxnOffsetCommitResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Topics contains responses to the topics in the request.
	Topics []TxnOffsetCommitResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v3+
}

func (*TxnOffsetCommitResponse) Key() int16                 { return 28 }
func (*TxnOffsetCommitResponse) MaxVersion() int16          { return 5 }
func (v *TxnOffsetCommitResponse) SetVersion(version int16) { v.Version = version }
func (v *TxnOffsetCommitResponse) GetVersion() int16        { return v.Version }
func (v *TxnOffsetCommitResponse) IsFlexible() bool         { return v.Version >= 3 }
func (v *TxnOffsetCommitResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 1 }
func (v *TxnOffsetCommitResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *TxnOffsetCommitResponse) RequestKind() Request {
	return &TxnOffsetCommitRequest{Version: v.Version}
}

func (v *TxnOffsetCommitResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *TxnOffsetCommitResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *TxnOffsetCommitResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *TxnOffsetCommitResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 3
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TxnOffsetCommitResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]TxnOffsetCommitResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrTxnOffsetCommitResponse returns a pointer to a default TxnOffsetCommitResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrTxnOffsetCommitResponse() *TxnOffsetCommitResponse {
	var v TxnOffsetCommitResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TxnOffsetCommitResponse.
func (v *TxnOffsetCommitResponse) Default() {
}

// NewTxnOffsetCommitResponse returns a default TxnOffsetCommitResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewTxnOffsetCommitResponse() TxnOffsetCommitResponse {
	var v TxnOffsetCommitResponse
	v.Default()
	return v
}

// DescribeACLsRequest describes ACLs. Describing ACLs works on a filter basis:
// anything that matches the filter is described. Note that there are two
// "types" of filters in this request: the resource filter and the entry
// filter, with entries corresponding to users. The first three fields form the
// resource filter, the last four the entry filter.
type DescribeACLsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ResourceType is the type of resource to describe.
	ResourceType ACLResourceType

	// ResourceName is the name to filter out. For the CLUSTER resource type,
	// this must be "kafka-cluster".
	ResourceName *string

	// ResourcePatternType is how ResourceName is understood.
	//
	// This field has a default of 3.
	ResourcePatternType ACLResourcePatternType // v1+

	// Principal is the user to filter for. In Kafka with the simple authorizor,
	// all principals begin with "User:". Pluggable authorizors are allowed, but
	// Kafka still expects principals to lead with a principal type ("User") and
	// have a colon separating the principal name ("bob" in "User:bob").
	Principal *string

	// Host is a host to filter for.
	Host *string

	// Operation is an operation to filter for.
	//
	// Note that READ, WRITE, DELETE, and ALTER imply DESCRIBE, and ALTER_CONFIGS
	// implies DESCRIBE_CONFIGS.
	Operation ACLOperation

	// PermissionType is the permission type to filter for. UNKNOWN is 0.
	PermissionType ACLPermissionType

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeACLsRequest) Key() int16                 { return 29 }
func (*DescribeACLsRequest) MaxVersion() int16          { return 3 }
func (v *DescribeACLsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeACLsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeACLsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *DescribeACLsRequest) ResponseKind() Response {
	r := &DescribeACLsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeACLsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeACLsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeACLsResponse)
	return resp, err
}

func (v *DescribeACLsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ResourceType
		{
			v := int8(v)
			dst = kbin.AppendInt8(dst, v)
		}
	}
	{
		v := v.ResourceName
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.ResourcePatternType
		{
			v := int8(v)
			dst = kbin.AppendInt8(dst, v)
		}
	}
	{
		v := v.Principal
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Host
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Operation
		{
			v := int8(v)
			dst = kbin.AppendInt8(dst, v)
		}
	}
	{
		v := v.PermissionType
		{
			v := int8(v)
			dst = kbin.AppendInt8(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeACLsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeACLsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeACLsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		var t ACLResourceType
		{
			v := b.Int8()
			t = ACLResourceType(v)
		}
		v := t
		s.ResourceType = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ResourceName = v
	}
	if version >= 1 {
		var t ACLResourcePatternType
		{
			v := b.Int8()
			t = ACLResourcePatternType(v)
		}
		v := t
		s.ResourcePatternType = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Principal = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Host = v
	}
	{
		var t ACLOperation
		{
			v := b.Int8()
			t = ACLOperation(v)
		}
		v := t
		s.Operation = v
	}
	{
		var t ACLPermissionType
		{
			v := b.Int8()
			t = ACLPermissionType(v)
		}
		v := t
		s.PermissionType = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeACLsRequest returns a pointer to a default DescribeACLsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeACLsRequest() *DescribeACLsRequest {
	var v DescribeACLsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeACLsRequest.
func (v *DescribeACLsRequest) Default() {
	v.ResourcePatternType = 3
}

// NewDescribeACLsRequest returns a default DescribeACLsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeACLsRequest() DescribeACLsRequest {
	var v DescribeACLsRequest
	v.Default()
	return v
}

type DescribeACLsResponseResourceACL struct {
	// Principal is who this ACL applies to.
	Principal string

	// Host is on which host this ACL applies.
	Host string

	// Operation is the operation being described.
	Operation ACLOperation

	// PermissionType is the permission being described.
	PermissionType ACLPermissionType

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeACLsResponseResourceACL.
func (v *DescribeACLsResponseResourceACL) Default() {
}

// NewDescribeACLsResponseResourceACL returns a default DescribeACLsResponseResourceACL
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeACLsResponseResourceACL() DescribeACLsResponseResourceACL {
	var v DescribeACLsResponseResourceACL
	v.Default()
	return v
}

type DescribeACLsResponseResource struct {
	// ResourceType is the resource type being described.
	ResourceType ACLResourceType

	// ResourceName is the resource name being described.
	ResourceName string

	// ResourcePatternType is the pattern type being described.
	//
	// This field has a default of 3.
	ResourcePatternType ACLResourcePatternType // v1+

	// ACLs contains users / entries being described.
	ACLs []DescribeACLsResponseResourceACL

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeACLsResponseResource.
func (v *DescribeACLsResponseResource) Default() {
	v.ResourcePatternType = 3
}

// NewDescribeACLsResponseResource returns a default DescribeACLsResponseResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeACLsResponseResource() DescribeACLsResponseResource {
	var v DescribeACLsResponseResource
	v.Default()
	return v
}

// DescribeACLsResponse is a response to a describe acls request.
type DescribeACLsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// ErrorCode is the error code returned on request failure.
	//
	// SECURITY_DISABLED is returned if there is no authorizer configured on the
	// broker.
	//
	// There can be other authorization failures.
	ErrorCode int16

	// ErrorMessage is a message for an error.
	ErrorMessage *string

	// Resources are the describe resources.
	Resources []DescribeACLsResponseResource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeACLsResponse) Key() int16                         { return 29 }
func (*DescribeACLsResponse) MaxVersion() int16                  { return 3 }
func (v *DescribeACLsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DescribeACLsResponse) GetVersion() int16                { return v.Version }
func (v *DescribeACLsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *DescribeACLsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *DescribeACLsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DescribeACLsResponse) RequestKind() Request             { return &DescribeACLsRequest{Version: v.Version} }

func (v *DescribeACLsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 1 {
				v := v.ResourcePatternType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ACLs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Principal
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Host
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Operation
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.PermissionType
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeACLsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeACLsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeACLsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeACLsResponseResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ACLResourceType
				{
					v := b.Int8()
					t = ACLResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			if version >= 1 {
				var t ACLResourcePatternType
				{
					v := b.Int8()
					t = ACLResourcePatternType(v)
				}
				v := t
				s.ResourcePatternType = v
			}
			{
				v := s.ACLs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeACLsResponseResourceACL, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Principal = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					{
						var t ACLOperation
						{
							v := b.Int8()
							t = ACLOperation(v)
						}
						v := t
						s.Operation = v
					}
					{
						var t ACLPermissionType
						{
							v := b.Int8()
							t = ACLPermissionType(v)
						}
						v := t
						s.PermissionType = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.ACLs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeACLsResponse returns a pointer to a default DescribeACLsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeACLsResponse() *DescribeACLsResponse {
	var v DescribeACLsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeACLsResponse.
func (v *DescribeACLsResponse) Default() {
}

// NewDescribeACLsResponse returns a default DescribeACLsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeACLsResponse() DescribeACLsResponse {
	var v DescribeACLsResponse
	v.Default()
	return v
}

type CreateACLsRequestCreation struct {
	// ResourceType is the type of resource this acl entry will be on.
	// It is invalid to use UNKNOWN or ANY.
	ResourceType ACLResourceType

	// ResourceName is the name of the resource this acl entry will be on.
	// For CLUSTER, this must be "kafka-cluster".
	ResourceName string

	// ResourcePatternType is the pattern type to use for the resource name.
	// This cannot be UNKNOWN or MATCH (i.e. this must be LITERAL or PREFIXED).
	// The default for pre-Kafka 2.0.0 is effectively LITERAL.
	//
	// This field has a default of 3.
	ResourcePatternType ACLResourcePatternType // v1+

	// Principal is the user to apply this acl for. With the Kafka simple
	// authorizer, this must begin with "User:".
	Principal string

	// Host is the host address to use for this acl. Each host to allow
	// the principal access from must be specified as a new creation. KIP-252
	// might solve this someday. The special wildcard host "*" allows all hosts.
	Host string

	// Operation is the operation this acl is for. This must not be UNKNOWN or
	// ANY.
	Operation ACLOperation

	// PermissionType is the permission of this acl. This must be either ALLOW
	// or DENY.
	PermissionType ACLPermissionType

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateACLsRequestCreation.
func (v *CreateACLsRequestCreation) Default() {
	v.ResourcePatternType = 3
}

// NewCreateACLsRequestCreation returns a default CreateACLsRequestCreation
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateACLsRequestCreation() CreateACLsRequestCreation {
	var v CreateACLsRequestCreation
	v.Default()
	return v
}

// CreateACLsRequest creates acls. Creating acls can be done as a batch; each
// "creation" will be an acl entry.
//
// See the DescribeACLsRequest documentation for more descriptions of what
// valid values for the fields in this request are.
type CreateACLsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	Creations []CreateACLsRequestCreation

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreateACLsRequest) Key() int16                 { return 30 }
func (*CreateACLsRequest) MaxVersion() int16          { return 3 }
func (v *CreateACLsRequest) SetVersion(version int16) { v.Version = version }
func (v *CreateACLsRequest) GetVersion() int16        { return v.Version }
func (v *CreateACLsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *CreateACLsRequest) ResponseKind() Response {
	r := &CreateACLsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *CreateACLsRequest) RequestWith(ctx context.Context, r Requestor) (*CreateACLsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*CreateACLsResponse)
	return resp, err
}

func (v *CreateACLsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Creations
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 1 {
				v := v.ResourcePatternType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.Principal
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Operation
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.PermissionType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateACLsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateACLsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateACLsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Creations
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreateACLsRequestCreation, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ACLResourceType
				{
					v := b.Int8()
					t = ACLResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			if version >= 1 {
				var t ACLResourcePatternType
				{
					v := b.Int8()
					t = ACLResourcePatternType(v)
				}
				v := t
				s.ResourcePatternType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Principal = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				var t ACLOperation
				{
					v := b.Int8()
					t = ACLOperation(v)
				}
				v := t
				s.Operation = v
			}
			{
				var t ACLPermissionType
				{
					v := b.Int8()
					t = ACLPermissionType(v)
				}
				v := t
				s.PermissionType = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Creations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateACLsRequest returns a pointer to a default CreateACLsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateACLsRequest() *CreateACLsRequest {
	var v CreateACLsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateACLsRequest.
func (v *CreateACLsRequest) Default() {
}

// NewCreateACLsRequest returns a default CreateACLsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateACLsRequest() CreateACLsRequest {
	var v CreateACLsRequest
	v.Default()
	return v
}

type CreateACLsResponseResult struct {
	// ErrorCode is an error for this particular creation (index wise).
	ErrorCode int16

	// ErrorMessage is a message for this error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateACLsResponseResult.
func (v *CreateACLsResponseResult) Default() {
}

// NewCreateACLsResponseResult returns a default CreateACLsResponseResult
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateACLsResponseResult() CreateACLsResponseResult {
	var v CreateACLsResponseResult
	v.Default()
	return v
}

// CreateACLsResponse is a response for a CreateACLsRequest.
type CreateACLsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Results contains responses to each creation request.
	Results []CreateACLsResponseResult

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreateACLsResponse) Key() int16                         { return 30 }
func (*CreateACLsResponse) MaxVersion() int16                  { return 3 }
func (v *CreateACLsResponse) SetVersion(version int16)         { v.Version = version }
func (v *CreateACLsResponse) GetVersion() int16                { return v.Version }
func (v *CreateACLsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *CreateACLsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *CreateACLsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *CreateACLsResponse) RequestKind() Request             { return &CreateACLsRequest{Version: v.Version} }

func (v *CreateACLsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Results
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateACLsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateACLsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateACLsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Results
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreateACLsResponseResult, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Results = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateACLsResponse returns a pointer to a default CreateACLsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateACLsResponse() *CreateACLsResponse {
	var v CreateACLsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateACLsResponse.
func (v *CreateACLsResponse) Default() {
}

// NewCreateACLsResponse returns a default CreateACLsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateACLsResponse() CreateACLsResponse {
	var v CreateACLsResponse
	v.Default()
	return v
}

type DeleteACLsRequestFilter struct {
	ResourceType ACLResourceType

	ResourceName *string

	// This field has a default of 3.
	ResourcePatternType ACLResourcePatternType // v1+

	Principal *string

	Host *string

	Operation ACLOperation

	PermissionType ACLPermissionType

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteACLsRequestFilter.
func (v *DeleteACLsRequestFilter) Default() {
	v.ResourcePatternType = 3
}

// NewDeleteACLsRequestFilter returns a default DeleteACLsRequestFilter
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteACLsRequestFilter() DeleteACLsRequestFilter {
	var v DeleteACLsRequestFilter
	v.Default()
	return v
}

// DeleteACLsRequest deletes acls. This request works on filters the same way
// that DescribeACLsRequest does. See DescribeACLsRequest for documentation of
// the fields.
type DeleteACLsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Filters are filters for acls to delete.
	Filters []DeleteACLsRequestFilter

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteACLsRequest) Key() int16                 { return 31 }
func (*DeleteACLsRequest) MaxVersion() int16          { return 3 }
func (v *DeleteACLsRequest) SetVersion(version int16) { v.Version = version }
func (v *DeleteACLsRequest) GetVersion() int16        { return v.Version }
func (v *DeleteACLsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *DeleteACLsRequest) ResponseKind() Response {
	r := &DeleteACLsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteACLsRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteACLsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteACLsResponse)
	return resp, err
}

func (v *DeleteACLsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Filters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if version >= 1 {
				v := v.ResourcePatternType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.Principal
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Operation
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.PermissionType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteACLsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteACLsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteACLsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Filters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteACLsRequestFilter, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ACLResourceType
				{
					v := b.Int8()
					t = ACLResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ResourceName = v
			}
			if version >= 1 {
				var t ACLResourcePatternType
				{
					v := b.Int8()
					t = ACLResourcePatternType(v)
				}
				v := t
				s.ResourcePatternType = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Principal = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Host = v
			}
			{
				var t ACLOperation
				{
					v := b.Int8()
					t = ACLOperation(v)
				}
				v := t
				s.Operation = v
			}
			{
				var t ACLPermissionType
				{
					v := b.Int8()
					t = ACLPermissionType(v)
				}
				v := t
				s.PermissionType = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Filters = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteACLsRequest returns a pointer to a default DeleteACLsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteACLsRequest() *DeleteACLsRequest {
	var v DeleteACLsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteACLsRequest.
func (v *DeleteACLsRequest) Default() {
}

// NewDeleteACLsRequest returns a default DeleteACLsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteACLsRequest() DeleteACLsRequest {
	var v DeleteACLsRequest
	v.Default()
	return v
}

type DeleteACLsResponseResultMatchingACL struct {
	// ErrorCode contains an error for this individual acl for this filter.
	ErrorCode int16

	// ErrorMessage is a message for this error.
	ErrorMessage *string

	ResourceType ACLResourceType

	ResourceName string

	// This field has a default of 3.
	ResourcePatternType ACLResourcePatternType // v1+

	Principal string

	Host string

	Operation ACLOperation

	PermissionType ACLPermissionType

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteACLsResponseResultMatchingACL.
func (v *DeleteACLsResponseResultMatchingACL) Default() {
	v.ResourcePatternType = 3
}

// NewDeleteACLsResponseResultMatchingACL returns a default DeleteACLsResponseResultMatchingACL
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteACLsResponseResultMatchingACL() DeleteACLsResponseResultMatchingACL {
	var v DeleteACLsResponseResultMatchingACL
	v.Default()
	return v
}

type DeleteACLsResponseResult struct {
	// ErrorCode is the overall error code for this individual filter.
	ErrorCode int16

	// ErrorMessage is a message for this error.
	ErrorMessage *string

	// MatchingACLs contains all acls that were matched for this filter.
	MatchingACLs []DeleteACLsResponseResultMatchingACL

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteACLsResponseResult.
func (v *DeleteACLsResponseResult) Default() {
}

// NewDeleteACLsResponseResult returns a default DeleteACLsResponseResult
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteACLsResponseResult() DeleteACLsResponseResult {
	var v DeleteACLsResponseResult
	v.Default()
	return v
}

// DeleteACLsResponse is a response for a DeleteACLsRequest.
type DeleteACLsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Results contains a response to each requested filter.
	Results []DeleteACLsResponseResult

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteACLsResponse) Key() int16                         { return 31 }
func (*DeleteACLsResponse) MaxVersion() int16                  { return 3 }
func (v *DeleteACLsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DeleteACLsResponse) GetVersion() int16                { return v.Version }
func (v *DeleteACLsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *DeleteACLsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *DeleteACLsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DeleteACLsResponse) RequestKind() Request             { return &DeleteACLsRequest{Version: v.Version} }

func (v *DeleteACLsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Results
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.MatchingACLs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ResourceType
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.ResourceName
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if version >= 1 {
						v := v.ResourcePatternType
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.Principal
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Host
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Operation
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.PermissionType
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteACLsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteACLsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteACLsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Results
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteACLsResponseResult, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				v := s.MatchingACLs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DeleteACLsResponseResultMatchingACL, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						var t ACLResourceType
						{
							v := b.Int8()
							t = ACLResourceType(v)
						}
						v := t
						s.ResourceType = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ResourceName = v
					}
					if version >= 1 {
						var t ACLResourcePatternType
						{
							v := b.Int8()
							t = ACLResourcePatternType(v)
						}
						v := t
						s.ResourcePatternType = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Principal = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					{
						var t ACLOperation
						{
							v := b.Int8()
							t = ACLOperation(v)
						}
						v := t
						s.Operation = v
					}
					{
						var t ACLPermissionType
						{
							v := b.Int8()
							t = ACLPermissionType(v)
						}
						v := t
						s.PermissionType = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.MatchingACLs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Results = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteACLsResponse returns a pointer to a default DeleteACLsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteACLsResponse() *DeleteACLsResponse {
	var v DeleteACLsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteACLsResponse.
func (v *DeleteACLsResponse) Default() {
}

// NewDeleteACLsResponse returns a default DeleteACLsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteACLsResponse() DeleteACLsResponse {
	var v DeleteACLsResponse
	v.Default()
	return v
}

type DescribeConfigsRequestResource struct {
	// ResourceType is an enum corresponding to the type of config to describe.
	ResourceType ConfigResourceType

	// ResourceName is the name of config to describe.
	//
	// If the requested type is a topic, this corresponds to a topic name.
	//
	// If the requested type if a broker, this should either be empty or be
	// the ID of the broker this request is issued to. If it is empty, this
	// returns all broker configs, but only the dynamic configuration values.
	// If a specific ID, this returns all broker config values.
	ResourceName string

	// ConfigNames is a list of config entries to return. Null requests all.
	ConfigNames []string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsRequestResource.
func (v *DescribeConfigsRequestResource) Default() {
}

// NewDescribeConfigsRequestResource returns a default DescribeConfigsRequestResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsRequestResource() DescribeConfigsRequestResource {
	var v DescribeConfigsRequestResource
	v.Default()
	return v
}

// DescribeConfigsRequest issues a request to describe configs that Kafka
// currently has. These are the key/value pairs that one uses to configure
// brokers and topics.
type DescribeConfigsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Resources is a list of resources to describe.
	Resources []DescribeConfigsRequestResource

	// IncludeSynonyms signifies whether to return config entry synonyms for
	// all config entries.
	IncludeSynonyms bool // v1+

	// IncludeDocumentation signifies whether to return documentation for
	// config entries.
	IncludeDocumentation bool // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*DescribeConfigsRequest) Key() int16                 { return 32 }
func (*DescribeConfigsRequest) MaxVersion() int16          { return 4 }
func (v *DescribeConfigsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeConfigsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeConfigsRequest) IsFlexible() bool         { return v.Version >= 4 }
func (v *DescribeConfigsRequest) ResponseKind() Response {
	r := &DescribeConfigsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeConfigsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeConfigsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeConfigsResponse)
	return resp, err
}

func (v *DescribeConfigsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ConfigNames
				if isFlexible {
					dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
				} else {
					dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
				}
				for i := range v {
					v := v[i]
					if isFlexible {
						dst = kbin.AppendCompactString(dst, v)
					} else {
						dst = kbin.AppendString(dst, v)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.IncludeSynonyms
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 3 {
		v := v.IncludeDocumentation
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeConfigsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeConfigsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeConfigsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeConfigsRequestResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			{
				v := s.ConfigNames
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if version < 0 || l == 0 {
					a = []string{}
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]string, l)...)
				}
				for i := int32(0); i < l; i++ {
					var v string
					if unsafe {
						if isFlexible {
							v = b.UnsafeCompactString()
						} else {
							v = b.UnsafeString()
						}
					} else {
						if isFlexible {
							v = b.CompactString()
						} else {
							v = b.String()
						}
					}
					a[i] = v
				}
				v = a
				s.ConfigNames = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	if version >= 1 {
		v := b.Bool()
		s.IncludeSynonyms = v
	}
	if version >= 3 {
		v := b.Bool()
		s.IncludeDocumentation = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeConfigsRequest returns a pointer to a default DescribeConfigsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeConfigsRequest() *DescribeConfigsRequest {
	var v DescribeConfigsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsRequest.
func (v *DescribeConfigsRequest) Default() {
}

// NewDescribeConfigsRequest returns a default DescribeConfigsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsRequest() DescribeConfigsRequest {
	var v DescribeConfigsRequest
	v.Default()
	return v
}

type DescribeConfigsResponseResourceConfigConfigSynonym struct {
	Name string

	Value *string

	Source ConfigSource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsResponseResourceConfigConfigSynonym.
func (v *DescribeConfigsResponseResourceConfigConfigSynonym) Default() {
}

// NewDescribeConfigsResponseResourceConfigConfigSynonym returns a default DescribeConfigsResponseResourceConfigConfigSynonym
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsResponseResourceConfigConfigSynonym() DescribeConfigsResponseResourceConfigConfigSynonym {
	var v DescribeConfigsResponseResourceConfigConfigSynonym
	v.Default()
	return v
}

type DescribeConfigsResponseResourceConfig struct {
	// Name is a key this entry corresponds to (e.g. segment.bytes).
	Name string

	// Value is the value for this config key. If the key is sensitive,
	// the value will be null.
	Value *string

	// ReadOnly signifies whether this is not a dynamic config option.
	//
	// Note that this field is not always correct, and you may need to check
	// whether the Source is any dynamic enum. See franz-go#91 for more details.
	ReadOnly bool

	// IsDefault is whether this is a default config option. This has been
	// replaced in favor of Source.
	IsDefault bool

	// Source is where this config entry is from.
	//
	// This field has a default of -1.
	Source ConfigSource // v1+

	// IsSensitive signifies whether this is a sensitive config key, which
	// is either a password or an unknown type.
	IsSensitive bool

	// ConfigSynonyms contains fallback key/value pairs for this config
	// entry, in order of preference. That is, if a config entry is both
	// dynamically configured and has a default, the top level return will be
	// the dynamic configuration, while its "synonym" will be the default.
	ConfigSynonyms []DescribeConfigsResponseResourceConfigConfigSynonym // v1+

	// ConfigType specifies the configuration data type.
	ConfigType ConfigType // v3+

	// Documentation is optional documentation for the config entry.
	Documentation *string // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsResponseResourceConfig.
func (v *DescribeConfigsResponseResourceConfig) Default() {
	v.Source = -1
}

// NewDescribeConfigsResponseResourceConfig returns a default DescribeConfigsResponseResourceConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsResponseResourceConfig() DescribeConfigsResponseResourceConfig {
	var v DescribeConfigsResponseResourceConfig
	v.Default()
	return v
}

type DescribeConfigsResponseResource struct {
	// ErrorCode is the error code returned for describing configs.
	//
	// INVALID_REQUEST is returned if asking to descibe an invalid resource
	// type.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if asking to describe broker
	// configs but the client is not authorized to do so.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if asking to describe topic
	// configs but the client is not authorized to do so.
	//
	// INVALID_TOPIC_EXCEPTION is returned if the requested topic was invalid.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the requested topic.
	ErrorCode int16

	// ErrorMessage is an informative message if the describe config failed.
	ErrorMessage *string

	// ResourceType is the enum corresponding to the type of described config.
	ResourceType ConfigResourceType

	// ResourceName is the name corresponding to the describe config request.
	ResourceName string

	// Configs contains information about key/value config pairs for
	// the requested resource.
	Configs []DescribeConfigsResponseResourceConfig

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsResponseResource.
func (v *DescribeConfigsResponseResource) Default() {
}

// NewDescribeConfigsResponseResource returns a default DescribeConfigsResponseResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsResponseResource() DescribeConfigsResponseResource {
	var v DescribeConfigsResponseResource
	v.Default()
	return v
}

// DescribeConfigsResponse is returned from a DescribeConfigsRequest.
type DescribeConfigsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 2.
	ThrottleMillis int32

	// Resources are responses for each resource in the describe config request.
	Resources []DescribeConfigsResponseResource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v4+
}

func (*DescribeConfigsResponse) Key() int16                 { return 32 }
func (*DescribeConfigsResponse) MaxVersion() int16          { return 4 }
func (v *DescribeConfigsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeConfigsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeConfigsResponse) IsFlexible() bool         { return v.Version >= 4 }
func (v *DescribeConfigsResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 2 }
func (v *DescribeConfigsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeConfigsResponse) RequestKind() Request {
	return &DescribeConfigsRequest{Version: v.Version}
}

func (v *DescribeConfigsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Configs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ReadOnly
						dst = kbin.AppendBool(dst, v)
					}
					if version >= 0 && version <= 0 {
						v := v.IsDefault
						dst = kbin.AppendBool(dst, v)
					}
					if version >= 1 {
						v := v.Source
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.IsSensitive
						dst = kbin.AppendBool(dst, v)
					}
					if version >= 1 {
						v := v.ConfigSynonyms
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Name
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.Value
								if isFlexible {
									dst = kbin.AppendCompactNullableString(dst, v)
								} else {
									dst = kbin.AppendNullableString(dst, v)
								}
							}
							{
								v := v.Source
								{
									v := int8(v)
									dst = kbin.AppendInt8(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if version >= 3 {
						v := v.ConfigType
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					if version >= 3 {
						v := v.Documentation
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeConfigsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeConfigsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeConfigsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 4
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeConfigsResponseResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			{
				v := s.Configs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeConfigsResponseResourceConfig, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Value = v
					}
					{
						v := b.Bool()
						s.ReadOnly = v
					}
					if version >= 0 && version <= 0 {
						v := b.Bool()
						s.IsDefault = v
					}
					if version >= 1 {
						var t ConfigSource
						{
							v := b.Int8()
							t = ConfigSource(v)
						}
						v := t
						s.Source = v
					}
					{
						v := b.Bool()
						s.IsSensitive = v
					}
					if version >= 1 {
						v := s.ConfigSynonyms
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeConfigsResponseResourceConfigConfigSynonym, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Name = v
							}
							{
								var v *string
								if isFlexible {
									if unsafe {
										v = b.UnsafeCompactNullableString()
									} else {
										v = b.CompactNullableString()
									}
								} else {
									if unsafe {
										v = b.UnsafeNullableString()
									} else {
										v = b.NullableString()
									}
								}
								s.Value = v
							}
							{
								var t ConfigSource
								{
									v := b.Int8()
									t = ConfigSource(v)
								}
								v := t
								s.Source = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.ConfigSynonyms = v
					}
					if version >= 3 {
						var t ConfigType
						{
							v := b.Int8()
							t = ConfigType(v)
						}
						v := t
						s.ConfigType = v
					}
					if version >= 3 {
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Documentation = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Configs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeConfigsResponse returns a pointer to a default DescribeConfigsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeConfigsResponse() *DescribeConfigsResponse {
	var v DescribeConfigsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeConfigsResponse.
func (v *DescribeConfigsResponse) Default() {
}

// NewDescribeConfigsResponse returns a default DescribeConfigsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeConfigsResponse() DescribeConfigsResponse {
	var v DescribeConfigsResponse
	v.Default()
	return v
}

type AlterConfigsRequestResourceConfig struct {
	// Name is a key to set (e.g. segment.bytes).
	Name string

	// Value is a value to set for the key (e.g. 10).
	Value *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterConfigsRequestResourceConfig.
func (v *AlterConfigsRequestResourceConfig) Default() {
}

// NewAlterConfigsRequestResourceConfig returns a default AlterConfigsRequestResourceConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterConfigsRequestResourceConfig() AlterConfigsRequestResourceConfig {
	var v AlterConfigsRequestResourceConfig
	v.Default()
	return v
}

type AlterConfigsRequestResource struct {
	// ResourceType is an enum corresponding to the type of config to alter.
	// The only two valid values are 2 (for topic) and 4 (for broker).
	ResourceType ConfigResourceType

	// ResourceName is the name of config to alter.
	//
	// If the requested type is a topic, this corresponds to a topic name.
	//
	// If the requested type if a broker, this should either be empty or be
	// the ID of the broker this request is issued to. If it is empty, this
	// updates all broker configs. If a specific ID, this updates just the
	// broker. Using a specific ID also ensures that brokers reload config
	// or secret files even if the file path has not changed. Lastly, password
	// config options can only be defined on a per broker basis.
	//
	// If the type is broker logger, this must be a broker ID.
	ResourceName string

	// Configs contains key/value config pairs to set on the resource.
	Configs []AlterConfigsRequestResourceConfig

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterConfigsRequestResource.
func (v *AlterConfigsRequestResource) Default() {
}

// NewAlterConfigsRequestResource returns a default AlterConfigsRequestResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterConfigsRequestResource() AlterConfigsRequestResource {
	var v AlterConfigsRequestResource
	v.Default()
	return v
}

// AlterConfigsRequest issues a request to alter either topic or broker
// configs.
//
// Note that to alter configs, you must specify the whole config on every
// request. All existing non-static values will be removed. This means that
// to add one key/value to a config, you must describe the config and then
// issue an alter request with the current config with the new key value.
// This also means that dynamic sensitive values, which are not returned
// in describe configs, will be lost.
//
// To fix this problem, the AlterConfigs request / response was deprecated
// in Kafka 2.3.0 in favor of the new IncrementalAlterConfigs request / response.
// See KIP-339 for more details.
type AlterConfigsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Resources is an array of configs to alter.
	Resources []AlterConfigsRequestResource

	// ValidateOnly validates the request but does not apply it.
	ValidateOnly bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*AlterConfigsRequest) Key() int16                 { return 33 }
func (*AlterConfigsRequest) MaxVersion() int16          { return 2 }
func (v *AlterConfigsRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterConfigsRequest) GetVersion() int16        { return v.Version }
func (v *AlterConfigsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *AlterConfigsRequest) ResponseKind() Response {
	r := &AlterConfigsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterConfigsRequest) RequestWith(ctx context.Context, r Requestor) (*AlterConfigsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterConfigsResponse)
	return resp, err
}

func (v *AlterConfigsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Configs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterConfigsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterConfigsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterConfigsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterConfigsRequestResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			{
				v := s.Configs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterConfigsRequestResourceConfig, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Value = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Configs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	{
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterConfigsRequest returns a pointer to a default AlterConfigsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterConfigsRequest() *AlterConfigsRequest {
	var v AlterConfigsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterConfigsRequest.
func (v *AlterConfigsRequest) Default() {
}

// NewAlterConfigsRequest returns a default AlterConfigsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterConfigsRequest() AlterConfigsRequest {
	var v AlterConfigsRequest
	v.Default()
	return v
}

type AlterConfigsResponseResource struct {
	// ErrorCode is the error code returned for altering configs.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if asking to alter broker
	// configs but the client is not authorized to do so.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if asking to alter topic
	// configs but the client is not authorized to do so.
	//
	// INVALID_TOPIC_EXCEPTION is returned if the requested topic was invalid.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the requested topic.
	//
	// INVALID_REQUEST is returned if the requested config is invalid or if
	// asking Kafka to alter an invalid resource.
	ErrorCode int16

	// ErrorMessage is an informative message if the alter config failed.
	ErrorMessage *string

	// ResourceType is the enum corresponding to the type of altered config.
	ResourceType ConfigResourceType

	// ResourceName is the name corresponding to the alter config request.
	ResourceName string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterConfigsResponseResource.
func (v *AlterConfigsResponseResource) Default() {
}

// NewAlterConfigsResponseResource returns a default AlterConfigsResponseResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterConfigsResponseResource() AlterConfigsResponseResource {
	var v AlterConfigsResponseResource
	v.Default()
	return v
}

// AlterConfigsResponse is returned from an AlterConfigsRequest.
type AlterConfigsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Resources are responses for each resource in the alter request.
	Resources []AlterConfigsResponseResource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*AlterConfigsResponse) Key() int16                         { return 33 }
func (*AlterConfigsResponse) MaxVersion() int16                  { return 2 }
func (v *AlterConfigsResponse) SetVersion(version int16)         { v.Version = version }
func (v *AlterConfigsResponse) GetVersion() int16                { return v.Version }
func (v *AlterConfigsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *AlterConfigsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *AlterConfigsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *AlterConfigsResponse) RequestKind() Request             { return &AlterConfigsRequest{Version: v.Version} }

func (v *AlterConfigsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterConfigsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterConfigsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterConfigsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterConfigsResponseResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterConfigsResponse returns a pointer to a default AlterConfigsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterConfigsResponse() *AlterConfigsResponse {
	var v AlterConfigsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterConfigsResponse.
func (v *AlterConfigsResponse) Default() {
}

// NewAlterConfigsResponse returns a default AlterConfigsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterConfigsResponse() AlterConfigsResponse {
	var v AlterConfigsResponse
	v.Default()
	return v
}

type AlterReplicaLogDirsRequestDirTopic struct {
	// Topic is a topic to move.
	Topic string

	// Partitions contains partitions for the topic to move.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsRequestDirTopic.
func (v *AlterReplicaLogDirsRequestDirTopic) Default() {
}

// NewAlterReplicaLogDirsRequestDirTopic returns a default AlterReplicaLogDirsRequestDirTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsRequestDirTopic() AlterReplicaLogDirsRequestDirTopic {
	var v AlterReplicaLogDirsRequestDirTopic
	v.Default()
	return v
}

type AlterReplicaLogDirsRequestDir struct {
	// Dir is an absolute path where everything listed below should
	// end up.
	Dir string

	// Topics contains topics to move to the above log directory.
	Topics []AlterReplicaLogDirsRequestDirTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsRequestDir.
func (v *AlterReplicaLogDirsRequestDir) Default() {
}

// NewAlterReplicaLogDirsRequestDir returns a default AlterReplicaLogDirsRequestDir
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsRequestDir() AlterReplicaLogDirsRequestDir {
	var v AlterReplicaLogDirsRequestDir
	v.Default()
	return v
}

// AlterReplicaLogDirsRequest requests for log directories to be moved
// within Kafka.
//
// This is primarily useful for moving directories between disks.
type AlterReplicaLogDirsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Dirs contains absolute paths of where you want things to end up.
	Dirs []AlterReplicaLogDirsRequestDir

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*AlterReplicaLogDirsRequest) Key() int16                 { return 34 }
func (*AlterReplicaLogDirsRequest) MaxVersion() int16          { return 2 }
func (v *AlterReplicaLogDirsRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterReplicaLogDirsRequest) GetVersion() int16        { return v.Version }
func (v *AlterReplicaLogDirsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *AlterReplicaLogDirsRequest) ResponseKind() Response {
	r := &AlterReplicaLogDirsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterReplicaLogDirsRequest) RequestWith(ctx context.Context, r Requestor) (*AlterReplicaLogDirsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterReplicaLogDirsResponse)
	return resp, err
}

func (v *AlterReplicaLogDirsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Dirs
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Dir
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterReplicaLogDirsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterReplicaLogDirsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterReplicaLogDirsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Dirs
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterReplicaLogDirsRequestDir, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Dir = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterReplicaLogDirsRequestDirTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Dirs = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterReplicaLogDirsRequest returns a pointer to a default AlterReplicaLogDirsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterReplicaLogDirsRequest() *AlterReplicaLogDirsRequest {
	var v AlterReplicaLogDirsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsRequest.
func (v *AlterReplicaLogDirsRequest) Default() {
}

// NewAlterReplicaLogDirsRequest returns a default AlterReplicaLogDirsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsRequest() AlterReplicaLogDirsRequest {
	var v AlterReplicaLogDirsRequest
	v.Default()
	return v
}

type AlterReplicaLogDirsResponseTopicPartition struct {
	// Partition is the partition this array slot corresponds to.
	Partition int32

	// CLUSTER_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to alter replica dirs.
	//
	// LOG_DIR_NOT_FOUND is returned when the requested log directory
	// is not in the broker config.
	//
	// KAFKA_STORAGE_EXCEPTION is returned when destination directory or
	// requested replica is offline.
	//
	// REPLICA_NOT_AVAILABLE is returned if the replica does not exist
	// yet.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsResponseTopicPartition.
func (v *AlterReplicaLogDirsResponseTopicPartition) Default() {
}

// NewAlterReplicaLogDirsResponseTopicPartition returns a default AlterReplicaLogDirsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsResponseTopicPartition() AlterReplicaLogDirsResponseTopicPartition {
	var v AlterReplicaLogDirsResponseTopicPartition
	v.Default()
	return v
}

type AlterReplicaLogDirsResponseTopic struct {
	// Topic is the topic this array slot corresponds to.
	Topic string

	// Partitions contains responses to each partition that was requested
	// to move.
	Partitions []AlterReplicaLogDirsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsResponseTopic.
func (v *AlterReplicaLogDirsResponseTopic) Default() {
}

// NewAlterReplicaLogDirsResponseTopic returns a default AlterReplicaLogDirsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsResponseTopic() AlterReplicaLogDirsResponseTopic {
	var v AlterReplicaLogDirsResponseTopic
	v.Default()
	return v
}

// AlterReplicaLogDirsResponse is returned from an AlterReplicaLogDirsRequest.
type AlterReplicaLogDirsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Topics contains responses to each topic that had partitions requested
	// for moving.
	Topics []AlterReplicaLogDirsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*AlterReplicaLogDirsResponse) Key() int16                 { return 34 }
func (*AlterReplicaLogDirsResponse) MaxVersion() int16          { return 2 }
func (v *AlterReplicaLogDirsResponse) SetVersion(version int16) { v.Version = version }
func (v *AlterReplicaLogDirsResponse) GetVersion() int16        { return v.Version }
func (v *AlterReplicaLogDirsResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *AlterReplicaLogDirsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *AlterReplicaLogDirsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AlterReplicaLogDirsResponse) RequestKind() Request {
	return &AlterReplicaLogDirsRequest{Version: v.Version}
}

func (v *AlterReplicaLogDirsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterReplicaLogDirsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterReplicaLogDirsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterReplicaLogDirsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterReplicaLogDirsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterReplicaLogDirsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterReplicaLogDirsResponse returns a pointer to a default AlterReplicaLogDirsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterReplicaLogDirsResponse() *AlterReplicaLogDirsResponse {
	var v AlterReplicaLogDirsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterReplicaLogDirsResponse.
func (v *AlterReplicaLogDirsResponse) Default() {
}

// NewAlterReplicaLogDirsResponse returns a default AlterReplicaLogDirsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterReplicaLogDirsResponse() AlterReplicaLogDirsResponse {
	var v AlterReplicaLogDirsResponse
	v.Default()
	return v
}

type DescribeLogDirsRequestTopic struct {
	// Topic is a topic to describe the log dir of.
	Topic string

	// Partitions contains topic partitions to describe the log dirs of.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsRequestTopic.
func (v *DescribeLogDirsRequestTopic) Default() {
}

// NewDescribeLogDirsRequestTopic returns a default DescribeLogDirsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsRequestTopic() DescribeLogDirsRequestTopic {
	var v DescribeLogDirsRequestTopic
	v.Default()
	return v
}

// DescribeLogDirsRequest requests directory information for topic partitions.
// This request was added in support of KIP-113.
type DescribeLogDirsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics is an array of topics to describe the log dirs of. If this is
	// null, the response includes all topics and all of their partitions.
	Topics []DescribeLogDirsRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeLogDirsRequest) Key() int16                 { return 35 }
func (*DescribeLogDirsRequest) MaxVersion() int16          { return 4 }
func (v *DescribeLogDirsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeLogDirsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeLogDirsRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *DescribeLogDirsRequest) ResponseKind() Response {
	r := &DescribeLogDirsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeLogDirsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeLogDirsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeLogDirsResponse)
	return resp, err
}

func (v *DescribeLogDirsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeLogDirsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeLogDirsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeLogDirsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []DescribeLogDirsRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeLogDirsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeLogDirsRequest returns a pointer to a default DescribeLogDirsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeLogDirsRequest() *DescribeLogDirsRequest {
	var v DescribeLogDirsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsRequest.
func (v *DescribeLogDirsRequest) Default() {
}

// NewDescribeLogDirsRequest returns a default DescribeLogDirsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsRequest() DescribeLogDirsRequest {
	var v DescribeLogDirsRequest
	v.Default()
	return v
}

type DescribeLogDirsResponseDirTopicPartition struct {
	// Partition is a partition ID.
	Partition int32

	// Size is the total size of the log sements of this partition, in bytes.
	Size int64

	// OffsetLag is how far behind the log end offset is compared to
	// the partition's high watermark (if this is the current log for
	// the partition) or compared to the current replica's log end
	// offset (if this is the future log for the patition).
	//
	// The math is,
	//
	// if IsFuture, localLogEndOffset - futurelogEndOffset.
	//
	// otherwise, max(localHighWatermark - logEndOffset, 0).
	OffsetLag int64

	// IsFuture is true if this replica was created by an
	// AlterReplicaLogDirsRequest and will replace the current log of the
	// replica in the future.
	IsFuture bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsResponseDirTopicPartition.
func (v *DescribeLogDirsResponseDirTopicPartition) Default() {
}

// NewDescribeLogDirsResponseDirTopicPartition returns a default DescribeLogDirsResponseDirTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsResponseDirTopicPartition() DescribeLogDirsResponseDirTopicPartition {
	var v DescribeLogDirsResponseDirTopicPartition
	v.Default()
	return v
}

type DescribeLogDirsResponseDirTopic struct {
	// Topic is the name of a Kafka topic.
	Topic string

	// Partitions is the set of queried partitions for a topic that are
	// within a log directory.
	Partitions []DescribeLogDirsResponseDirTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsResponseDirTopic.
func (v *DescribeLogDirsResponseDirTopic) Default() {
}

// NewDescribeLogDirsResponseDirTopic returns a default DescribeLogDirsResponseDirTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsResponseDirTopic() DescribeLogDirsResponseDirTopic {
	var v DescribeLogDirsResponseDirTopic
	v.Default()
	return v
}

type DescribeLogDirsResponseDir struct {
	// ErrorCode is the error code returned for describing log dirs.
	//
	// KAFKA_STORAGE_ERROR is returned if the log directory is offline.
	ErrorCode int16

	// Dir is the absolute path of a log directory.
	Dir string

	// Topics is an array of topics within a log directory.
	Topics []DescribeLogDirsResponseDirTopic

	// TotalBytes is the total size in bytes of the volume the log directory is
	// in.
	//
	// This field has a default of -1.
	TotalBytes int64 // v4+

	// UsableBytes is the usable size in bytes of the volume the log directory
	// is in.
	//
	// This field has a default of -1.
	UsableBytes int64 // v4+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsResponseDir.
func (v *DescribeLogDirsResponseDir) Default() {
	v.TotalBytes = -1
	v.UsableBytes = -1
}

// NewDescribeLogDirsResponseDir returns a default DescribeLogDirsResponseDir
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsResponseDir() DescribeLogDirsResponseDir {
	var v DescribeLogDirsResponseDir
	v.Default()
	return v
}

// DescribeLogDirsResponse is returned from a DescribeLogDirsRequest.
type DescribeLogDirsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// The error code, or 0 if there was no error.
	ErrorCode int16 // v3+

	// Dirs pairs log directories with the topics and partitions that are
	// stored in those directories.
	Dirs []DescribeLogDirsResponseDir

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeLogDirsResponse) Key() int16                 { return 35 }
func (*DescribeLogDirsResponse) MaxVersion() int16          { return 4 }
func (v *DescribeLogDirsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeLogDirsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeLogDirsResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *DescribeLogDirsResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 1 }
func (v *DescribeLogDirsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeLogDirsResponse) RequestKind() Request {
	return &DescribeLogDirsRequest{Version: v.Version}
}

func (v *DescribeLogDirsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 3 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Dirs
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.Dir
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.Size
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.OffsetLag
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.IsFuture
								dst = kbin.AppendBool(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if version >= 4 {
				v := v.TotalBytes
				dst = kbin.AppendInt64(dst, v)
			}
			if version >= 4 {
				v := v.UsableBytes
				dst = kbin.AppendInt64(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeLogDirsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeLogDirsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeLogDirsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 3 {
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Dirs
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeLogDirsResponseDir, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Dir = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeLogDirsResponseDirTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeLogDirsResponseDirTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int64()
								s.Size = v
							}
							{
								v := b.Int64()
								s.OffsetLag = v
							}
							{
								v := b.Bool()
								s.IsFuture = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if version >= 4 {
				v := b.Int64()
				s.TotalBytes = v
			}
			if version >= 4 {
				v := b.Int64()
				s.UsableBytes = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Dirs = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeLogDirsResponse returns a pointer to a default DescribeLogDirsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeLogDirsResponse() *DescribeLogDirsResponse {
	var v DescribeLogDirsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeLogDirsResponse.
func (v *DescribeLogDirsResponse) Default() {
}

// NewDescribeLogDirsResponse returns a default DescribeLogDirsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeLogDirsResponse() DescribeLogDirsResponse {
	var v DescribeLogDirsResponse
	v.Default()
	return v
}

// SASLAuthenticate continues a sasl authentication flow. Prior to Kafka 1.0.0,
// authenticating with sasl involved sending raw blobs of data back and forth.
// After, those blobs are wrapped in a SASLAuthenticateRequest The benefit of
// this wrapping is that Kafka can indicate errors in the response, rather than
// just closing the connection. Additionally, the response allows for further
// extension fields.
type SASLAuthenticateRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// SASLAuthBytes contains bytes for a SASL client request.
	SASLAuthBytes []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*SASLAuthenticateRequest) Key() int16                 { return 36 }
func (*SASLAuthenticateRequest) MaxVersion() int16          { return 2 }
func (v *SASLAuthenticateRequest) SetVersion(version int16) { v.Version = version }
func (v *SASLAuthenticateRequest) GetVersion() int16        { return v.Version }
func (v *SASLAuthenticateRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *SASLAuthenticateRequest) ResponseKind() Response {
	r := &SASLAuthenticateResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *SASLAuthenticateRequest) RequestWith(ctx context.Context, r Requestor) (*SASLAuthenticateResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*SASLAuthenticateResponse)
	return resp, err
}

func (v *SASLAuthenticateRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.SASLAuthBytes
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *SASLAuthenticateRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SASLAuthenticateRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SASLAuthenticateRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.SASLAuthBytes = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrSASLAuthenticateRequest returns a pointer to a default SASLAuthenticateRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSASLAuthenticateRequest() *SASLAuthenticateRequest {
	var v SASLAuthenticateRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SASLAuthenticateRequest.
func (v *SASLAuthenticateRequest) Default() {
}

// NewSASLAuthenticateRequest returns a default SASLAuthenticateRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewSASLAuthenticateRequest() SASLAuthenticateRequest {
	var v SASLAuthenticateRequest
	v.Default()
	return v
}

// SASLAuthenticateResponse is returned for a SASLAuthenticateRequest.
type SASLAuthenticateResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is a potential error.
	ErrorCode int16

	// ErrorMessage can contain a message for an error.
	ErrorMessage *string

	// SASLAuthBytes is the server challenge continuing SASL flow.
	SASLAuthBytes []byte

	// SessionLifetimeMillis, added in Kafka 2.2.0, is how long the SASL
	// authentication is valid for. This timeout is only enforced if the request
	// was v1. After this timeout, Kafka expects the next bytes on the wire to
	// begin reauthentication. Otherwise, Kafka closes the connection.
	SessionLifetimeMillis int64 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*SASLAuthenticateResponse) Key() int16                 { return 36 }
func (*SASLAuthenticateResponse) MaxVersion() int16          { return 2 }
func (v *SASLAuthenticateResponse) SetVersion(version int16) { v.Version = version }
func (v *SASLAuthenticateResponse) GetVersion() int16        { return v.Version }
func (v *SASLAuthenticateResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *SASLAuthenticateResponse) RequestKind() Request {
	return &SASLAuthenticateRequest{Version: v.Version}
}

func (v *SASLAuthenticateResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.SASLAuthBytes
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	if version >= 1 {
		v := v.SessionLifetimeMillis
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *SASLAuthenticateResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *SASLAuthenticateResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *SASLAuthenticateResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.SASLAuthBytes = v
	}
	if version >= 1 {
		v := b.Int64()
		s.SessionLifetimeMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrSASLAuthenticateResponse returns a pointer to a default SASLAuthenticateResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrSASLAuthenticateResponse() *SASLAuthenticateResponse {
	var v SASLAuthenticateResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to SASLAuthenticateResponse.
func (v *SASLAuthenticateResponse) Default() {
}

// NewSASLAuthenticateResponse returns a default SASLAuthenticateResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewSASLAuthenticateResponse() SASLAuthenticateResponse {
	var v SASLAuthenticateResponse
	v.Default()
	return v
}

type CreatePartitionsRequestTopicAssignment struct {
	// Replicas are replicas to assign a new partition to.
	Replicas []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreatePartitionsRequestTopicAssignment.
func (v *CreatePartitionsRequestTopicAssignment) Default() {
}

// NewCreatePartitionsRequestTopicAssignment returns a default CreatePartitionsRequestTopicAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreatePartitionsRequestTopicAssignment() CreatePartitionsRequestTopicAssignment {
	var v CreatePartitionsRequestTopicAssignment
	v.Default()
	return v
}

type CreatePartitionsRequestTopic struct {
	// Topic is a topic for which to create additional partitions for.
	Topic string

	// Count is the final count of partitions this topic must have after this
	// request. This must be greater than the current number of partitions.
	Count int32

	// Assignment is a two-level array, the first corresponding to new
	// partitions, the second contining broker IDs for where new partition
	// replicas should live.
	//
	// The second level, the replicas, cannot have duplicate broker IDs (i.e.
	// you cannot replicate a single partition twice on the same broker).
	// Additionally, the number of replicas must match the current number of
	// replicas per partition on the topic.
	//
	// The first level's length must be equal to the delta of Count and the
	// current number of partitions.
	Assignment []CreatePartitionsRequestTopicAssignment

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreatePartitionsRequestTopic.
func (v *CreatePartitionsRequestTopic) Default() {
}

// NewCreatePartitionsRequestTopic returns a default CreatePartitionsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreatePartitionsRequestTopic() CreatePartitionsRequestTopic {
	var v CreatePartitionsRequestTopic
	v.Default()
	return v
}

// CreatePartitionsRequest creates additional partitions for topics.
type CreatePartitionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics contains topics to create partitions for.
	Topics []CreatePartitionsRequestTopic

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 15000.
	TimeoutMillis int32

	// ValidateOnly is makes this request a dry-run; everything is validated but
	// no partitions are actually created.
	ValidateOnly bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreatePartitionsRequest) Key() int16                       { return 37 }
func (*CreatePartitionsRequest) MaxVersion() int16                { return 3 }
func (v *CreatePartitionsRequest) SetVersion(version int16)       { v.Version = version }
func (v *CreatePartitionsRequest) GetVersion() int16              { return v.Version }
func (v *CreatePartitionsRequest) IsFlexible() bool               { return v.Version >= 2 }
func (v *CreatePartitionsRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *CreatePartitionsRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *CreatePartitionsRequest) IsAdminRequest()                {}
func (v *CreatePartitionsRequest) ResponseKind() Response {
	r := &CreatePartitionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *CreatePartitionsRequest) RequestWith(ctx context.Context, r Requestor) (*CreatePartitionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*CreatePartitionsResponse)
	return resp, err
}

func (v *CreatePartitionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Count
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Assignment
				if isFlexible {
					dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
				} else {
					dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreatePartitionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreatePartitionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreatePartitionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreatePartitionsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Count = v
			}
			{
				v := s.Assignment
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if version < 0 || l == 0 {
					a = []CreatePartitionsRequestTopicAssignment{}
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]CreatePartitionsRequestTopicAssignment, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Assignment = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreatePartitionsRequest returns a pointer to a default CreatePartitionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreatePartitionsRequest() *CreatePartitionsRequest {
	var v CreatePartitionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreatePartitionsRequest.
func (v *CreatePartitionsRequest) Default() {
	v.TimeoutMillis = 15000
}

// NewCreatePartitionsRequest returns a default CreatePartitionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreatePartitionsRequest() CreatePartitionsRequest {
	var v CreatePartitionsRequest
	v.Default()
	return v
}

type CreatePartitionsResponseTopic struct {
	// Topic is the topic that partitions were requested to be made for.
	Topic string

	// ErrorCode is the error code returned for each topic in the request.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to create partitions for a topic.
	//
	// INVALID_REQUEST is returned for duplicate topics in the request.
	//
	// INVALID_TOPIC_EXCEPTION is returned if the topic is queued for deletion.
	//
	// REASSIGNMENT_IN_PROGRESS is returned if the request was issued while
	// partitions were being reassigned.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the topic for which to create partitions.
	//
	// INVALID_PARTITIONS is returned if the request would drop the total
	// count of partitions down, or if the request would not add any more
	// partitions, or if the request uses unknown brokers, or if the request
	// assigns a different number of brokers than the increase in the
	// partition count.
	ErrorCode int16

	// ErrorMessage is an informative message if the topic creation failed.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreatePartitionsResponseTopic.
func (v *CreatePartitionsResponseTopic) Default() {
}

// NewCreatePartitionsResponseTopic returns a default CreatePartitionsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreatePartitionsResponseTopic() CreatePartitionsResponseTopic {
	var v CreatePartitionsResponseTopic
	v.Default()
	return v
}

// CreatePartitionsResponse is returned from a CreatePartitionsRequest.
type CreatePartitionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Topics is a response to each topic in the creation request.
	Topics []CreatePartitionsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreatePartitionsResponse) Key() int16                 { return 37 }
func (*CreatePartitionsResponse) MaxVersion() int16          { return 3 }
func (v *CreatePartitionsResponse) SetVersion(version int16) { v.Version = version }
func (v *CreatePartitionsResponse) GetVersion() int16        { return v.Version }
func (v *CreatePartitionsResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *CreatePartitionsResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 1 }
func (v *CreatePartitionsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *CreatePartitionsResponse) RequestKind() Request {
	return &CreatePartitionsRequest{Version: v.Version}
}

func (v *CreatePartitionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreatePartitionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreatePartitionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreatePartitionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreatePartitionsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreatePartitionsResponse returns a pointer to a default CreatePartitionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreatePartitionsResponse() *CreatePartitionsResponse {
	var v CreatePartitionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreatePartitionsResponse.
func (v *CreatePartitionsResponse) Default() {
}

// NewCreatePartitionsResponse returns a default CreatePartitionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreatePartitionsResponse() CreatePartitionsResponse {
	var v CreatePartitionsResponse
	v.Default()
	return v
}

type CreateDelegationTokenRequestRenewer struct {
	// PrincipalType is the "type" this principal is. This must be "User".
	PrincipalType string

	// PrincipalName is the user name allowed to renew the returned token.
	PrincipalName string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateDelegationTokenRequestRenewer.
func (v *CreateDelegationTokenRequestRenewer) Default() {
}

// NewCreateDelegationTokenRequestRenewer returns a default CreateDelegationTokenRequestRenewer
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateDelegationTokenRequestRenewer() CreateDelegationTokenRequestRenewer {
	var v CreateDelegationTokenRequestRenewer
	v.Default()
	return v
}

// CreateDelegationTokenRequest issues a request to create a delegation token.
//
// Creating delegation tokens allows for an (ideally) quicker and easier method
// of enabling authorization for a wide array of clients. Rather than having to
// manage many passwords external to Kafka, you only need to manage a few
// accounts and use those to create delegation tokens per client.
//
// Note that delegation tokens inherit the same ACLs as the user creating the
// token. Thus, if you want to properly scope ACLs, you should not create
// delegation tokens with admin accounts.
//
// Delegation tokens live inside of Kafka and use SASL SCRAM-SHA-256 for
// authorization.
type CreateDelegationTokenRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The principal type of the owner of the token. If null, this defaults
	// to the token request principal.
	OwnerPrincipalType *string // v3+

	// Principal name of the owner of the token. If null, this defaults to
	// the token request principal.
	OwnerPrincipalName *string // v3+

	// Renewers is a list of who can renew this delegation token. If empty, the
	// default is the principal (user) who created the token.
	Renewers []CreateDelegationTokenRequestRenewer

	// MaxLifetimeMillis is how long this delegation token will be valid for.
	// If -1, the default will be the server's delegation.token.max.lifetime.ms.
	MaxLifetimeMillis int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreateDelegationTokenRequest) Key() int16                 { return 38 }
func (*CreateDelegationTokenRequest) MaxVersion() int16          { return 3 }
func (v *CreateDelegationTokenRequest) SetVersion(version int16) { v.Version = version }
func (v *CreateDelegationTokenRequest) GetVersion() int16        { return v.Version }
func (v *CreateDelegationTokenRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *CreateDelegationTokenRequest) ResponseKind() Response {
	r := &CreateDelegationTokenResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *CreateDelegationTokenRequest) RequestWith(ctx context.Context, r Requestor) (*CreateDelegationTokenResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*CreateDelegationTokenResponse)
	return resp, err
}

func (v *CreateDelegationTokenRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	if version >= 3 {
		v := v.OwnerPrincipalType
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 3 {
		v := v.OwnerPrincipalName
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Renewers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.PrincipalType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.PrincipalName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.MaxLifetimeMillis
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateDelegationTokenRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateDelegationTokenRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateDelegationTokenRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.OwnerPrincipalType = v
	}
	if version >= 3 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.OwnerPrincipalName = v
	}
	{
		v := s.Renewers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]CreateDelegationTokenRequestRenewer, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalName = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Renewers = v
	}
	{
		v := b.Int64()
		s.MaxLifetimeMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateDelegationTokenRequest returns a pointer to a default CreateDelegationTokenRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateDelegationTokenRequest() *CreateDelegationTokenRequest {
	var v CreateDelegationTokenRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateDelegationTokenRequest.
func (v *CreateDelegationTokenRequest) Default() {
}

// NewCreateDelegationTokenRequest returns a default CreateDelegationTokenRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateDelegationTokenRequest() CreateDelegationTokenRequest {
	var v CreateDelegationTokenRequest
	v.Default()
	return v
}

// CreateDelegationTokenResponse is a response to a CreateDelegationTokenRequest.
type CreateDelegationTokenResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is any error that caused the request to fail.
	ErrorCode int16

	// PrincipalType is the type of principal that granted this delegation token.
	// This will always be "User" with the simple authorizer.
	PrincipalType string

	// PrincipalName is the name of the principal that granted this delegation
	// token.
	PrincipalName string

	// The principal type of the requester of the token.
	TokenRequesterPrincipalType string // v3+

	// The principal name of the requester token.
	TokenRequesterPrincipalName string // v3+

	// IssueTimestamp is the millisecond timestamp this delegation token was
	// issued.
	IssueTimestamp int64

	// ExpiryTimestamp is the millisecond timestamp this token will expire. The
	// token can be renewed up to MaxTimestamp, past which point, it will be
	// invalid. The Kafka default is 24h.
	ExpiryTimestamp int64

	// MaxTimestamp is the millisecond timestamp past which this token cannot
	// be renewed.
	MaxTimestamp int64

	// TokenID is the ID of this token; this will be used as the username for
	// scram authentication.
	TokenID string

	// HMAC is the password of this token; this will be used as the password for
	// scram authentication.
	HMAC []byte

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*CreateDelegationTokenResponse) Key() int16                 { return 38 }
func (*CreateDelegationTokenResponse) MaxVersion() int16          { return 3 }
func (v *CreateDelegationTokenResponse) SetVersion(version int16) { v.Version = version }
func (v *CreateDelegationTokenResponse) GetVersion() int16        { return v.Version }
func (v *CreateDelegationTokenResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *CreateDelegationTokenResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *CreateDelegationTokenResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *CreateDelegationTokenResponse) RequestKind() Request {
	return &CreateDelegationTokenRequest{Version: v.Version}
}

func (v *CreateDelegationTokenResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.PrincipalType
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.PrincipalName
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.TokenRequesterPrincipalType
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	if version >= 3 {
		v := v.TokenRequesterPrincipalName
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.IssueTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ExpiryTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.MaxTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.TokenID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.HMAC
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *CreateDelegationTokenResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *CreateDelegationTokenResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *CreateDelegationTokenResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.PrincipalType = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.PrincipalName = v
	}
	if version >= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TokenRequesterPrincipalType = v
	}
	if version >= 3 {
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TokenRequesterPrincipalName = v
	}
	{
		v := b.Int64()
		s.IssueTimestamp = v
	}
	{
		v := b.Int64()
		s.ExpiryTimestamp = v
	}
	{
		v := b.Int64()
		s.MaxTimestamp = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.TokenID = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.HMAC = v
	}
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrCreateDelegationTokenResponse returns a pointer to a default CreateDelegationTokenResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrCreateDelegationTokenResponse() *CreateDelegationTokenResponse {
	var v CreateDelegationTokenResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to CreateDelegationTokenResponse.
func (v *CreateDelegationTokenResponse) Default() {
}

// NewCreateDelegationTokenResponse returns a default CreateDelegationTokenResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewCreateDelegationTokenResponse() CreateDelegationTokenResponse {
	var v CreateDelegationTokenResponse
	v.Default()
	return v
}

// RenewDelegationTokenRequest is a request to renew a delegation token that
// has not yet hit its max timestamp. Note that a client using a token cannot
// renew its own token.
type RenewDelegationTokenRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// HMAC is the HMAC of the token to be renewed.
	HMAC []byte

	// RenewTimeMillis is how long to renew the token for. If -1, Kafka uses its
	// delegation.token.max.lifetime.ms.
	RenewTimeMillis int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*RenewDelegationTokenRequest) Key() int16                 { return 39 }
func (*RenewDelegationTokenRequest) MaxVersion() int16          { return 2 }
func (v *RenewDelegationTokenRequest) SetVersion(version int16) { v.Version = version }
func (v *RenewDelegationTokenRequest) GetVersion() int16        { return v.Version }
func (v *RenewDelegationTokenRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *RenewDelegationTokenRequest) ResponseKind() Response {
	r := &RenewDelegationTokenResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *RenewDelegationTokenRequest) RequestWith(ctx context.Context, r Requestor) (*RenewDelegationTokenResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*RenewDelegationTokenResponse)
	return resp, err
}

func (v *RenewDelegationTokenRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.HMAC
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	{
		v := v.RenewTimeMillis
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *RenewDelegationTokenRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *RenewDelegationTokenRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *RenewDelegationTokenRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.HMAC = v
	}
	{
		v := b.Int64()
		s.RenewTimeMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrRenewDelegationTokenRequest returns a pointer to a default RenewDelegationTokenRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrRenewDelegationTokenRequest() *RenewDelegationTokenRequest {
	var v RenewDelegationTokenRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to RenewDelegationTokenRequest.
func (v *RenewDelegationTokenRequest) Default() {
}

// NewRenewDelegationTokenRequest returns a default RenewDelegationTokenRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewRenewDelegationTokenRequest() RenewDelegationTokenRequest {
	var v RenewDelegationTokenRequest
	v.Default()
	return v
}

// RenewDelegationTokenResponse is a response to a RenewDelegationTokenRequest.
type RenewDelegationTokenResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is any error that caused the request to fail.
	ErrorCode int16

	// ExpiryTimestamp is the millisecond timestamp this token will expire. The
	// token can be renewed up to MaxTimestamp, past which point, it will be
	// invalid. The Kafka default is 24h.
	ExpiryTimestamp int64

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*RenewDelegationTokenResponse) Key() int16                 { return 39 }
func (*RenewDelegationTokenResponse) MaxVersion() int16          { return 2 }
func (v *RenewDelegationTokenResponse) SetVersion(version int16) { v.Version = version }
func (v *RenewDelegationTokenResponse) GetVersion() int16        { return v.Version }
func (v *RenewDelegationTokenResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *RenewDelegationTokenResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *RenewDelegationTokenResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *RenewDelegationTokenResponse) RequestKind() Request {
	return &RenewDelegationTokenRequest{Version: v.Version}
}

func (v *RenewDelegationTokenResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ExpiryTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *RenewDelegationTokenResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *RenewDelegationTokenResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *RenewDelegationTokenResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int64()
		s.ExpiryTimestamp = v
	}
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrRenewDelegationTokenResponse returns a pointer to a default RenewDelegationTokenResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrRenewDelegationTokenResponse() *RenewDelegationTokenResponse {
	var v RenewDelegationTokenResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to RenewDelegationTokenResponse.
func (v *RenewDelegationTokenResponse) Default() {
}

// NewRenewDelegationTokenResponse returns a default RenewDelegationTokenResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewRenewDelegationTokenResponse() RenewDelegationTokenResponse {
	var v RenewDelegationTokenResponse
	v.Default()
	return v
}

// ExpireDelegationTokenRequest is a request to change the expiry timestamp
// of a delegation token. Note that a client using a token cannot expire its
// own token.
type ExpireDelegationTokenRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// HMAC is the HMAC of the token to change the expiry timestamp of.
	HMAC []byte

	// ExpiryPeriodMillis changes the delegation token's expiry timestamp to
	// now + expiry time millis. This can be used to force tokens to expire
	// quickly, or to allow tokens a grace period before expiry. You cannot
	// add enough expiry that exceeds the original max timestamp.
	ExpiryPeriodMillis int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*ExpireDelegationTokenRequest) Key() int16                 { return 40 }
func (*ExpireDelegationTokenRequest) MaxVersion() int16          { return 2 }
func (v *ExpireDelegationTokenRequest) SetVersion(version int16) { v.Version = version }
func (v *ExpireDelegationTokenRequest) GetVersion() int16        { return v.Version }
func (v *ExpireDelegationTokenRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *ExpireDelegationTokenRequest) ResponseKind() Response {
	r := &ExpireDelegationTokenResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ExpireDelegationTokenRequest) RequestWith(ctx context.Context, r Requestor) (*ExpireDelegationTokenResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ExpireDelegationTokenResponse)
	return resp, err
}

func (v *ExpireDelegationTokenRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.HMAC
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	{
		v := v.ExpiryPeriodMillis
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ExpireDelegationTokenRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ExpireDelegationTokenRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ExpireDelegationTokenRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.HMAC = v
	}
	{
		v := b.Int64()
		s.ExpiryPeriodMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrExpireDelegationTokenRequest returns a pointer to a default ExpireDelegationTokenRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrExpireDelegationTokenRequest() *ExpireDelegationTokenRequest {
	var v ExpireDelegationTokenRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ExpireDelegationTokenRequest.
func (v *ExpireDelegationTokenRequest) Default() {
}

// NewExpireDelegationTokenRequest returns a default ExpireDelegationTokenRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewExpireDelegationTokenRequest() ExpireDelegationTokenRequest {
	var v ExpireDelegationTokenRequest
	v.Default()
	return v
}

// ExpireDelegationTokenResponse is a response to an ExpireDelegationTokenRequest.
type ExpireDelegationTokenResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is any error that caused the request to fail.
	ErrorCode int16

	// ExpiryTimestamp is the new timestamp at which the delegation token will
	// expire.
	ExpiryTimestamp int64

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*ExpireDelegationTokenResponse) Key() int16                 { return 40 }
func (*ExpireDelegationTokenResponse) MaxVersion() int16          { return 2 }
func (v *ExpireDelegationTokenResponse) SetVersion(version int16) { v.Version = version }
func (v *ExpireDelegationTokenResponse) GetVersion() int16        { return v.Version }
func (v *ExpireDelegationTokenResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *ExpireDelegationTokenResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *ExpireDelegationTokenResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ExpireDelegationTokenResponse) RequestKind() Request {
	return &ExpireDelegationTokenRequest{Version: v.Version}
}

func (v *ExpireDelegationTokenResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ExpiryTimestamp
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ExpireDelegationTokenResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ExpireDelegationTokenResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ExpireDelegationTokenResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int64()
		s.ExpiryTimestamp = v
	}
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrExpireDelegationTokenResponse returns a pointer to a default ExpireDelegationTokenResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrExpireDelegationTokenResponse() *ExpireDelegationTokenResponse {
	var v ExpireDelegationTokenResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ExpireDelegationTokenResponse.
func (v *ExpireDelegationTokenResponse) Default() {
}

// NewExpireDelegationTokenResponse returns a default ExpireDelegationTokenResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewExpireDelegationTokenResponse() ExpireDelegationTokenResponse {
	var v ExpireDelegationTokenResponse
	v.Default()
	return v
}

type DescribeDelegationTokenRequestOwner struct {
	// PrincipalType is a type to match to describe delegation tokens created
	// with this principal. This would be "User" with the simple authorizer.
	PrincipalType string

	// PrincipalName is the name to match to describe delegation tokens created
	// with this principal.
	PrincipalName string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeDelegationTokenRequestOwner.
func (v *DescribeDelegationTokenRequestOwner) Default() {
}

// NewDescribeDelegationTokenRequestOwner returns a default DescribeDelegationTokenRequestOwner
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeDelegationTokenRequestOwner() DescribeDelegationTokenRequestOwner {
	var v DescribeDelegationTokenRequestOwner
	v.Default()
	return v
}

// DescribeDelegationTokenRequest is a request to describe delegation tokens.
type DescribeDelegationTokenRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Owners contains owners to describe delegation tokens for, or null for all.
	// If non-null, only tokens created from a matching principal type, name
	// combination are printed.
	Owners []DescribeDelegationTokenRequestOwner

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeDelegationTokenRequest) Key() int16                 { return 41 }
func (*DescribeDelegationTokenRequest) MaxVersion() int16          { return 3 }
func (v *DescribeDelegationTokenRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeDelegationTokenRequest) GetVersion() int16        { return v.Version }
func (v *DescribeDelegationTokenRequest) IsFlexible() bool         { return v.Version >= 2 }
func (v *DescribeDelegationTokenRequest) ResponseKind() Response {
	r := &DescribeDelegationTokenResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeDelegationTokenRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeDelegationTokenResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeDelegationTokenResponse)
	return resp, err
}

func (v *DescribeDelegationTokenRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Owners
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.PrincipalType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.PrincipalName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeDelegationTokenRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeDelegationTokenRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeDelegationTokenRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Owners
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []DescribeDelegationTokenRequestOwner{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeDelegationTokenRequestOwner, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalName = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Owners = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeDelegationTokenRequest returns a pointer to a default DescribeDelegationTokenRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeDelegationTokenRequest() *DescribeDelegationTokenRequest {
	var v DescribeDelegationTokenRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeDelegationTokenRequest.
func (v *DescribeDelegationTokenRequest) Default() {
}

// NewDescribeDelegationTokenRequest returns a default DescribeDelegationTokenRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeDelegationTokenRequest() DescribeDelegationTokenRequest {
	var v DescribeDelegationTokenRequest
	v.Default()
	return v
}

type DescribeDelegationTokenResponseTokenDetailRenewer struct {
	PrincipalType string

	PrincipalName string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeDelegationTokenResponseTokenDetailRenewer.
func (v *DescribeDelegationTokenResponseTokenDetailRenewer) Default() {
}

// NewDescribeDelegationTokenResponseTokenDetailRenewer returns a default DescribeDelegationTokenResponseTokenDetailRenewer
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeDelegationTokenResponseTokenDetailRenewer() DescribeDelegationTokenResponseTokenDetailRenewer {
	var v DescribeDelegationTokenResponseTokenDetailRenewer
	v.Default()
	return v
}

type DescribeDelegationTokenResponseTokenDetail struct {
	// PrincipalType is the principal type of who created this token.
	PrincipalType string

	// PrincipalName is the principal name of who created this token.
	PrincipalName string

	// The principal type of the requester of the token.
	TokenRequesterPrincipalType string // v3+

	// The principal name of the requester token.
	TokenRequesterPrincipalName string // v3+

	// IssueTimestamp is the millisecond timestamp of when this token was issued.
	IssueTimestamp int64

	// ExpiryTimestamp is the millisecond timestamp of when this token will expire.
	ExpiryTimestamp int64

	// MaxTimestamp is the millisecond timestamp past which whis token cannot
	// be renewed.
	MaxTimestamp int64

	// TokenID is the ID (scram username) of this token.
	TokenID string

	// HMAC is the password of this token.
	HMAC []byte

	// Renewers is a list of users that can renew this token.
	Renewers []DescribeDelegationTokenResponseTokenDetailRenewer

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeDelegationTokenResponseTokenDetail.
func (v *DescribeDelegationTokenResponseTokenDetail) Default() {
}

// NewDescribeDelegationTokenResponseTokenDetail returns a default DescribeDelegationTokenResponseTokenDetail
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeDelegationTokenResponseTokenDetail() DescribeDelegationTokenResponseTokenDetail {
	var v DescribeDelegationTokenResponseTokenDetail
	v.Default()
	return v
}

// DescribeDelegationTokenResponsee is a response to a DescribeDelegationTokenRequest.
type DescribeDelegationTokenResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is any error that caused the request to fail.
	ErrorCode int16

	// TokenDetails shows information about each token created from any principal
	// in the request.
	TokenDetails []DescribeDelegationTokenResponseTokenDetail

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DescribeDelegationTokenResponse) Key() int16                 { return 41 }
func (*DescribeDelegationTokenResponse) MaxVersion() int16          { return 3 }
func (v *DescribeDelegationTokenResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeDelegationTokenResponse) GetVersion() int16        { return v.Version }
func (v *DescribeDelegationTokenResponse) IsFlexible() bool         { return v.Version >= 2 }
func (v *DescribeDelegationTokenResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 1
}

func (v *DescribeDelegationTokenResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeDelegationTokenResponse) RequestKind() Request {
	return &DescribeDelegationTokenRequest{Version: v.Version}
}

func (v *DescribeDelegationTokenResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.TokenDetails
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.PrincipalType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.PrincipalName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 3 {
				v := v.TokenRequesterPrincipalType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 3 {
				v := v.TokenRequesterPrincipalName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.IssueTimestamp
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.ExpiryTimestamp
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.MaxTimestamp
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.TokenID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.HMAC
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			{
				v := v.Renewers
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.PrincipalType
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.PrincipalName
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeDelegationTokenResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeDelegationTokenResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeDelegationTokenResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.TokenDetails
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeDelegationTokenResponseTokenDetail, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.PrincipalName = v
			}
			if version >= 3 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TokenRequesterPrincipalType = v
			}
			if version >= 3 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TokenRequesterPrincipalName = v
			}
			{
				v := b.Int64()
				s.IssueTimestamp = v
			}
			{
				v := b.Int64()
				s.ExpiryTimestamp = v
			}
			{
				v := b.Int64()
				s.MaxTimestamp = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TokenID = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.HMAC = v
			}
			{
				v := s.Renewers
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeDelegationTokenResponseTokenDetailRenewer, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.PrincipalType = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.PrincipalName = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Renewers = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TokenDetails = v
	}
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeDelegationTokenResponse returns a pointer to a default DescribeDelegationTokenResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeDelegationTokenResponse() *DescribeDelegationTokenResponse {
	var v DescribeDelegationTokenResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeDelegationTokenResponse.
func (v *DescribeDelegationTokenResponse) Default() {
}

// NewDescribeDelegationTokenResponse returns a default DescribeDelegationTokenResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeDelegationTokenResponse() DescribeDelegationTokenResponse {
	var v DescribeDelegationTokenResponse
	v.Default()
	return v
}

// DeleteGroupsRequest deletes consumer groups. This request was added for
// Kafka 1.1.0 corresponding to the removal of RetentionTimeMillis from
// OffsetCommitRequest. See KIP-229 for more details.
type DeleteGroupsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Groups is a list of groups to delete.
	Groups []string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteGroupsRequest) Key() int16                   { return 42 }
func (*DeleteGroupsRequest) MaxVersion() int16            { return 2 }
func (v *DeleteGroupsRequest) SetVersion(version int16)   { v.Version = version }
func (v *DeleteGroupsRequest) GetVersion() int16          { return v.Version }
func (v *DeleteGroupsRequest) IsFlexible() bool           { return v.Version >= 2 }
func (v *DeleteGroupsRequest) IsGroupCoordinatorRequest() {}
func (v *DeleteGroupsRequest) ResponseKind() Response {
	r := &DeleteGroupsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteGroupsRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteGroupsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteGroupsResponse)
	return resp, err
}

func (v *DeleteGroupsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteGroupsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteGroupsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteGroupsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteGroupsRequest returns a pointer to a default DeleteGroupsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteGroupsRequest() *DeleteGroupsRequest {
	var v DeleteGroupsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteGroupsRequest.
func (v *DeleteGroupsRequest) Default() {
}

// NewDeleteGroupsRequest returns a default DeleteGroupsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteGroupsRequest() DeleteGroupsRequest {
	var v DeleteGroupsRequest
	v.Default()
	return v
}

type DeleteGroupsResponseGroup struct {
	// Group is a group ID requested for deletion.
	Group string

	// ErrorCode is the error code returned for this group's deletion request.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// to delete a group.
	//
	// INVALID_GROUP_ID is returned if the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator for this
	// group is not yet active.
	//
	// GROUP_ID_NOT_FOUND is returned if the group ID does not exist.
	//
	// NON_EMPTY_GROUP is returned if attempting to delete a group that is
	// not in the empty state.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteGroupsResponseGroup.
func (v *DeleteGroupsResponseGroup) Default() {
}

// NewDeleteGroupsResponseGroup returns a default DeleteGroupsResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteGroupsResponseGroup() DeleteGroupsResponseGroup {
	var v DeleteGroupsResponseGroup
	v.Default()
	return v
}

// DeleteGroupsResponse is returned from a DeleteGroupsRequest.
type DeleteGroupsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after this request.
	// For Kafka < 2.0.0, the throttle is applied before issuing a response.
	// For Kafka >= 2.0.0, the throttle is applied after issuing a response.
	//
	// This request switched at version 1.
	ThrottleMillis int32

	// Groups are the responses to each group requested for deletion.
	Groups []DeleteGroupsResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*DeleteGroupsResponse) Key() int16                         { return 42 }
func (*DeleteGroupsResponse) MaxVersion() int16                  { return 2 }
func (v *DeleteGroupsResponse) SetVersion(version int16)         { v.Version = version }
func (v *DeleteGroupsResponse) GetVersion() int16                { return v.Version }
func (v *DeleteGroupsResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *DeleteGroupsResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 1 }
func (v *DeleteGroupsResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *DeleteGroupsResponse) RequestKind() Request             { return &DeleteGroupsRequest{Version: v.Version} }

func (v *DeleteGroupsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteGroupsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteGroupsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteGroupsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteGroupsResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteGroupsResponse returns a pointer to a default DeleteGroupsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteGroupsResponse() *DeleteGroupsResponse {
	var v DeleteGroupsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteGroupsResponse.
func (v *DeleteGroupsResponse) Default() {
}

// NewDeleteGroupsResponse returns a default DeleteGroupsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteGroupsResponse() DeleteGroupsResponse {
	var v DeleteGroupsResponse
	v.Default()
	return v
}

type ElectLeadersRequestTopic struct {
	// Topic is a topic to trigger leader elections for (but only for the
	// partitions below).
	Topic string

	// Partitions is an array of partitions in a topic to trigger leader
	// elections for.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ElectLeadersRequestTopic.
func (v *ElectLeadersRequestTopic) Default() {
}

// NewElectLeadersRequestTopic returns a default ElectLeadersRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewElectLeadersRequestTopic() ElectLeadersRequestTopic {
	var v ElectLeadersRequestTopic
	v.Default()
	return v
}

// ElectLeadersRequest begins a leader election for all given topic
// partitions. This request was added in Kafka 2.2.0 to replace the zookeeper
// only option of triggering leader elections before. See KIP-183 for more
// details. KIP-460 introduced the ElectionType field with Kafka 2.4.0.
type ElectLeadersRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ElectionType is the type of election to conduct. 0 elects the preferred
	// replica, 1 elects the first live replica if there are no in-sync replicas
	// (i.e., unclean leader election).
	ElectionType int8 // v1+

	// Topics is an array of topics and corresponding partitions to
	// trigger leader elections for, or null for all.
	Topics []ElectLeadersRequestTopic

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 60000.
	TimeoutMillis int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*ElectLeadersRequest) Key() int16                       { return 43 }
func (*ElectLeadersRequest) MaxVersion() int16                { return 2 }
func (v *ElectLeadersRequest) SetVersion(version int16)       { v.Version = version }
func (v *ElectLeadersRequest) GetVersion() int16              { return v.Version }
func (v *ElectLeadersRequest) IsFlexible() bool               { return v.Version >= 2 }
func (v *ElectLeadersRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *ElectLeadersRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *ElectLeadersRequest) IsAdminRequest()                {}
func (v *ElectLeadersRequest) ResponseKind() Response {
	r := &ElectLeadersResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ElectLeadersRequest) RequestWith(ctx context.Context, r Requestor) (*ElectLeadersResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ElectLeadersResponse)
	return resp, err
}

func (v *ElectLeadersRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	if version >= 1 {
		v := v.ElectionType
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ElectLeadersRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ElectLeadersRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ElectLeadersRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	if version >= 1 {
		v := b.Int8()
		s.ElectionType = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []ElectLeadersRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ElectLeadersRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrElectLeadersRequest returns a pointer to a default ElectLeadersRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrElectLeadersRequest() *ElectLeadersRequest {
	var v ElectLeadersRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ElectLeadersRequest.
func (v *ElectLeadersRequest) Default() {
	v.TimeoutMillis = 60000
}

// NewElectLeadersRequest returns a default ElectLeadersRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewElectLeadersRequest() ElectLeadersRequest {
	var v ElectLeadersRequest
	v.Default()
	return v
}

type ElectLeadersResponseTopicPartition struct {
	// Partition is the partition for this result.
	Partition int32

	// ErrorCode is the error code returned for this topic/partition leader
	// election.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to trigger leader elections.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the topic/partition does
	// not exist on any broker in the cluster (this is slightly different
	// from the usual meaning of a single broker not knowing of the topic
	// partition).
	//
	// PREFERRED_LEADER_NOT_AVAILABLE is returned if the preferred leader
	// could not be elected (for example, the preferred leader was not in
	// the ISR).
	ErrorCode int16

	// ErrorMessage is an informative message if the leader election failed.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ElectLeadersResponseTopicPartition.
func (v *ElectLeadersResponseTopicPartition) Default() {
}

// NewElectLeadersResponseTopicPartition returns a default ElectLeadersResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewElectLeadersResponseTopicPartition() ElectLeadersResponseTopicPartition {
	var v ElectLeadersResponseTopicPartition
	v.Default()
	return v
}

type ElectLeadersResponseTopic struct {
	// Topic is topic for the given partition results below.
	Topic string

	// Partitions contains election results for a topic's partitions.
	Partitions []ElectLeadersResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ElectLeadersResponseTopic.
func (v *ElectLeadersResponseTopic) Default() {
}

// NewElectLeadersResponseTopic returns a default ElectLeadersResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewElectLeadersResponseTopic() ElectLeadersResponseTopic {
	var v ElectLeadersResponseTopic
	v.Default()
	return v
}

// ElectLeadersResponse is a response for an ElectLeadersRequest.
type ElectLeadersResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is any error that applies to all partitions.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to reassign partitions.
	ErrorCode int16 // v1+

	// Topics contains leader election results for each requested topic.
	Topics []ElectLeadersResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v2+
}

func (*ElectLeadersResponse) Key() int16                         { return 43 }
func (*ElectLeadersResponse) MaxVersion() int16                  { return 2 }
func (v *ElectLeadersResponse) SetVersion(version int16)         { v.Version = version }
func (v *ElectLeadersResponse) GetVersion() int16                { return v.Version }
func (v *ElectLeadersResponse) IsFlexible() bool                 { return v.Version >= 2 }
func (v *ElectLeadersResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *ElectLeadersResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ElectLeadersResponse) RequestKind() Request             { return &ElectLeadersRequest{Version: v.Version} }

func (v *ElectLeadersResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ElectLeadersResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ElectLeadersResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ElectLeadersResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 2
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 1 {
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ElectLeadersResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ElectLeadersResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrElectLeadersResponse returns a pointer to a default ElectLeadersResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrElectLeadersResponse() *ElectLeadersResponse {
	var v ElectLeadersResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ElectLeadersResponse.
func (v *ElectLeadersResponse) Default() {
}

// NewElectLeadersResponse returns a default ElectLeadersResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewElectLeadersResponse() ElectLeadersResponse {
	var v ElectLeadersResponse
	v.Default()
	return v
}

type IncrementalAlterConfigsRequestResourceConfig struct {
	// Name is a key to modify (e.g. segment.bytes).
	//
	// For broker loggers, see KIP-412 section "Request/Response Overview"
	// for details on how to change per logger log levels.
	Name string

	// Op is the type of operation to perform for this config name.
	//
	// SET (0) is to set a configuration value; the value must not be null.
	//
	// DELETE (1) is to delete a configuration key.
	//
	// APPEND (2) is to add a value to the list of values for a key (if the
	// key is for a list of values).
	//
	// SUBTRACT (3) is to remove a value from a list of values (if the key
	// is for a list of values).
	Op IncrementalAlterConfigOp

	// Value is a value to set for the key (e.g. 10).
	Value *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to IncrementalAlterConfigsRequestResourceConfig.
func (v *IncrementalAlterConfigsRequestResourceConfig) Default() {
}

// NewIncrementalAlterConfigsRequestResourceConfig returns a default IncrementalAlterConfigsRequestResourceConfig
// This is a shortcut for creating a struct and calling Default yourself.
func NewIncrementalAlterConfigsRequestResourceConfig() IncrementalAlterConfigsRequestResourceConfig {
	var v IncrementalAlterConfigsRequestResourceConfig
	v.Default()
	return v
}

type IncrementalAlterConfigsRequestResource struct {
	// ResourceType is an enum corresponding to the type of config to alter.
	ResourceType ConfigResourceType

	// ResourceName is the name of config to alter.
	//
	// If the requested type is a topic, this corresponds to a topic name.
	//
	// If the requested type if a broker, this should either be empty or be
	// the ID of the broker this request is issued to. If it is empty, this
	// updates all broker configs. If a specific ID, this updates just the
	// broker. Using a specific ID also ensures that brokers reload config
	// or secret files even if the file path has not changed. Lastly, password
	// config options can only be defined on a per broker basis.
	//
	// If the type is broker logger, this must be a broker ID.
	ResourceName string

	// Configs contains key/value config pairs to set on the resource.
	Configs []IncrementalAlterConfigsRequestResourceConfig

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to IncrementalAlterConfigsRequestResource.
func (v *IncrementalAlterConfigsRequestResource) Default() {
}

// NewIncrementalAlterConfigsRequestResource returns a default IncrementalAlterConfigsRequestResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewIncrementalAlterConfigsRequestResource() IncrementalAlterConfigsRequestResource {
	var v IncrementalAlterConfigsRequestResource
	v.Default()
	return v
}

// IncrementalAlterConfigsRequest issues ar equest to alter either topic or
// broker configs.
//
// This API was added in Kafka 2.3.0 to replace AlterConfigs. The key benefit
// of this API is that consumers do not need to know the full config state
// to add or remove new config options. See KIP-339 for more details.
type IncrementalAlterConfigsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Resources is an array of configs to alter.
	Resources []IncrementalAlterConfigsRequestResource

	// ValidateOnly validates the request but does not apply it.
	ValidateOnly bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*IncrementalAlterConfigsRequest) Key() int16                 { return 44 }
func (*IncrementalAlterConfigsRequest) MaxVersion() int16          { return 1 }
func (v *IncrementalAlterConfigsRequest) SetVersion(version int16) { v.Version = version }
func (v *IncrementalAlterConfigsRequest) GetVersion() int16        { return v.Version }
func (v *IncrementalAlterConfigsRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *IncrementalAlterConfigsRequest) ResponseKind() Response {
	r := &IncrementalAlterConfigsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *IncrementalAlterConfigsRequest) RequestWith(ctx context.Context, r Requestor) (*IncrementalAlterConfigsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*IncrementalAlterConfigsResponse)
	return resp, err
}

func (v *IncrementalAlterConfigsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Configs
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Op
						{
							v := int8(v)
							dst = kbin.AppendInt8(dst, v)
						}
					}
					{
						v := v.Value
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *IncrementalAlterConfigsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *IncrementalAlterConfigsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *IncrementalAlterConfigsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]IncrementalAlterConfigsRequestResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			{
				v := s.Configs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]IncrementalAlterConfigsRequestResourceConfig, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var t IncrementalAlterConfigOp
						{
							v := b.Int8()
							t = IncrementalAlterConfigOp(v)
						}
						v := t
						s.Op = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Value = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Configs = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	{
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrIncrementalAlterConfigsRequest returns a pointer to a default IncrementalAlterConfigsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrIncrementalAlterConfigsRequest() *IncrementalAlterConfigsRequest {
	var v IncrementalAlterConfigsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to IncrementalAlterConfigsRequest.
func (v *IncrementalAlterConfigsRequest) Default() {
}

// NewIncrementalAlterConfigsRequest returns a default IncrementalAlterConfigsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewIncrementalAlterConfigsRequest() IncrementalAlterConfigsRequest {
	var v IncrementalAlterConfigsRequest
	v.Default()
	return v
}

type IncrementalAlterConfigsResponseResource struct {
	// ErrorCode is the error code returned for incrementally altering configs.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if asking to alter broker
	// configs but the client is not authorized to do so.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if asking to alter topic
	// configs but the client is not authorized to do so.
	//
	// INVALID_TOPIC_EXCEPTION is returned if the requested topic was invalid.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the requested topic.
	//
	// INVALID_REQUEST is returned if the requested config is invalid or if
	// asking Kafka to alter an invalid resource.
	ErrorCode int16

	// ErrorMessage is an informative message if the incremental alter config failed.
	ErrorMessage *string

	// ResourceType is the enum corresponding to the type of altered config.
	ResourceType ConfigResourceType

	// ResourceName is the name corresponding to the incremental alter config
	// request.
	ResourceName string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to IncrementalAlterConfigsResponseResource.
func (v *IncrementalAlterConfigsResponseResource) Default() {
}

// NewIncrementalAlterConfigsResponseResource returns a default IncrementalAlterConfigsResponseResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewIncrementalAlterConfigsResponseResource() IncrementalAlterConfigsResponseResource {
	var v IncrementalAlterConfigsResponseResource
	v.Default()
	return v
}

// IncrementalAlterConfigsResponse is returned from an IncrementalAlterConfigsRequest.
type IncrementalAlterConfigsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Resources are responses for each resources in the alter request.
	Resources []IncrementalAlterConfigsResponseResource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*IncrementalAlterConfigsResponse) Key() int16                 { return 44 }
func (*IncrementalAlterConfigsResponse) MaxVersion() int16          { return 1 }
func (v *IncrementalAlterConfigsResponse) SetVersion(version int16) { v.Version = version }
func (v *IncrementalAlterConfigsResponse) GetVersion() int16        { return v.Version }
func (v *IncrementalAlterConfigsResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *IncrementalAlterConfigsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *IncrementalAlterConfigsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *IncrementalAlterConfigsResponse) RequestKind() Request {
	return &IncrementalAlterConfigsRequest{Version: v.Version}
}

func (v *IncrementalAlterConfigsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Resources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.ResourceType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.ResourceName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *IncrementalAlterConfigsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *IncrementalAlterConfigsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *IncrementalAlterConfigsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Resources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]IncrementalAlterConfigsResponseResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var t ConfigResourceType
				{
					v := b.Int8()
					t = ConfigResourceType(v)
				}
				v := t
				s.ResourceType = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.ResourceName = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Resources = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrIncrementalAlterConfigsResponse returns a pointer to a default IncrementalAlterConfigsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrIncrementalAlterConfigsResponse() *IncrementalAlterConfigsResponse {
	var v IncrementalAlterConfigsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to IncrementalAlterConfigsResponse.
func (v *IncrementalAlterConfigsResponse) Default() {
}

// NewIncrementalAlterConfigsResponse returns a default IncrementalAlterConfigsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewIncrementalAlterConfigsResponse() IncrementalAlterConfigsResponse {
	var v IncrementalAlterConfigsResponse
	v.Default()
	return v
}

type AlterPartitionAssignmentsRequestTopicPartition struct {
	// Partition is a partition to reassign.
	Partition int32

	// Replicas are replicas to place the partition on, or null to
	// cancel a pending reassignment of this partition.
	Replicas []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsRequestTopicPartition.
func (v *AlterPartitionAssignmentsRequestTopicPartition) Default() {
}

// NewAlterPartitionAssignmentsRequestTopicPartition returns a default AlterPartitionAssignmentsRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsRequestTopicPartition() AlterPartitionAssignmentsRequestTopicPartition {
	var v AlterPartitionAssignmentsRequestTopicPartition
	v.Default()
	return v
}

type AlterPartitionAssignmentsRequestTopic struct {
	// Topic is a topic to reassign the partitions of.
	Topic string

	// Partitions contains partitions to reassign.
	Partitions []AlterPartitionAssignmentsRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsRequestTopic.
func (v *AlterPartitionAssignmentsRequestTopic) Default() {
}

// NewAlterPartitionAssignmentsRequestTopic returns a default AlterPartitionAssignmentsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsRequestTopic() AlterPartitionAssignmentsRequestTopic {
	var v AlterPartitionAssignmentsRequestTopic
	v.Default()
	return v
}

// AlterPartitionAssignmentsRequest, proposed in KIP-455 and implemented in
// Kafka 2.4.0, is a request to reassign partitions to certain brokers.
//
// ACL wise, this requires ALTER on CLUSTER.
type AlterPartitionAssignmentsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 60000.
	TimeoutMillis int32

	// The option indicating whether changing the replication factor of any given
	// partition as part of this request is a valid move.
	//
	// This field has a default of true.
	AllowReplicationFactorChange bool // v1+

	// Topics are topics for which to reassign partitions of.
	Topics []AlterPartitionAssignmentsRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterPartitionAssignmentsRequest) Key() int16                 { return 45 }
func (*AlterPartitionAssignmentsRequest) MaxVersion() int16          { return 1 }
func (v *AlterPartitionAssignmentsRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterPartitionAssignmentsRequest) GetVersion() int16        { return v.Version }
func (v *AlterPartitionAssignmentsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterPartitionAssignmentsRequest) Timeout() int32           { return v.TimeoutMillis }
func (v *AlterPartitionAssignmentsRequest) SetTimeout(timeoutMillis int32) {
	v.TimeoutMillis = timeoutMillis
}
func (v *AlterPartitionAssignmentsRequest) IsAdminRequest() {}
func (v *AlterPartitionAssignmentsRequest) ResponseKind() Response {
	r := &AlterPartitionAssignmentsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterPartitionAssignmentsRequest) RequestWith(ctx context.Context, r Requestor) (*AlterPartitionAssignmentsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterPartitionAssignmentsResponse)
	return resp, err
}

func (v *AlterPartitionAssignmentsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.AllowReplicationFactorChange
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
						} else {
							dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterPartitionAssignmentsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterPartitionAssignmentsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterPartitionAssignmentsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	if version >= 1 {
		v := b.Bool()
		s.AllowReplicationFactorChange = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterPartitionAssignmentsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterPartitionAssignmentsRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if version < 0 || l == 0 {
							a = []int32{}
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterPartitionAssignmentsRequest returns a pointer to a default AlterPartitionAssignmentsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterPartitionAssignmentsRequest() *AlterPartitionAssignmentsRequest {
	var v AlterPartitionAssignmentsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsRequest.
func (v *AlterPartitionAssignmentsRequest) Default() {
	v.TimeoutMillis = 60000
	v.AllowReplicationFactorChange = true
}

// NewAlterPartitionAssignmentsRequest returns a default AlterPartitionAssignmentsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsRequest() AlterPartitionAssignmentsRequest {
	var v AlterPartitionAssignmentsRequest
	v.Default()
	return v
}

type AlterPartitionAssignmentsResponseTopicPartition struct {
	// Partition is the partition being responded to.
	Partition int32

	// ErrorCode is the error code returned for partition reassignments.
	//
	// REQUEST_TIMED_OUT is returned if the request timed out.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to reassign partitions.
	//
	// NO_REASSIGNMENT_IN_PROGRESS is returned for partition reassignment
	// cancellations when the partition was not being reassigned.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the requested topic or the topic is being deleted.
	ErrorCode int16

	// ErrorMessage is an informative message if the partition reassignment failed.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsResponseTopicPartition.
func (v *AlterPartitionAssignmentsResponseTopicPartition) Default() {
}

// NewAlterPartitionAssignmentsResponseTopicPartition returns a default AlterPartitionAssignmentsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsResponseTopicPartition() AlterPartitionAssignmentsResponseTopicPartition {
	var v AlterPartitionAssignmentsResponseTopicPartition
	v.Default()
	return v
}

type AlterPartitionAssignmentsResponseTopic struct {
	// Topic is the topic being responded to.
	Topic string

	// Partitions contains responses for partitions.
	Partitions []AlterPartitionAssignmentsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsResponseTopic.
func (v *AlterPartitionAssignmentsResponseTopic) Default() {
}

// NewAlterPartitionAssignmentsResponseTopic returns a default AlterPartitionAssignmentsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsResponseTopic() AlterPartitionAssignmentsResponseTopic {
	var v AlterPartitionAssignmentsResponseTopic
	v.Default()
	return v
}

// AlterPartitionAssignmentsResponse is returned for an AlterPartitionAssignmentsRequest.
type AlterPartitionAssignmentsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The option indicating whether changing the replication factor of any given
	// partition as part of the request was allowed.
	//
	// This field has a default of true.
	AllowReplicationFactorChange bool // v1+

	// ErrorCode is any global (applied to all partitions) error code.
	ErrorCode int16

	// ErrorMessage is any global (applied to all partitions) error message.
	ErrorMessage *string

	// Topics contains responses for each topic requested.
	Topics []AlterPartitionAssignmentsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterPartitionAssignmentsResponse) Key() int16                 { return 45 }
func (*AlterPartitionAssignmentsResponse) MaxVersion() int16          { return 1 }
func (v *AlterPartitionAssignmentsResponse) SetVersion(version int16) { v.Version = version }
func (v *AlterPartitionAssignmentsResponse) GetVersion() int16        { return v.Version }
func (v *AlterPartitionAssignmentsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterPartitionAssignmentsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *AlterPartitionAssignmentsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AlterPartitionAssignmentsResponse) RequestKind() Request {
	return &AlterPartitionAssignmentsRequest{Version: v.Version}
}

func (v *AlterPartitionAssignmentsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.AllowReplicationFactorChange
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterPartitionAssignmentsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterPartitionAssignmentsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterPartitionAssignmentsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	if version >= 1 {
		v := b.Bool()
		s.AllowReplicationFactorChange = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterPartitionAssignmentsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterPartitionAssignmentsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterPartitionAssignmentsResponse returns a pointer to a default AlterPartitionAssignmentsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterPartitionAssignmentsResponse() *AlterPartitionAssignmentsResponse {
	var v AlterPartitionAssignmentsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionAssignmentsResponse.
func (v *AlterPartitionAssignmentsResponse) Default() {
	v.AllowReplicationFactorChange = true
}

// NewAlterPartitionAssignmentsResponse returns a default AlterPartitionAssignmentsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionAssignmentsResponse() AlterPartitionAssignmentsResponse {
	var v AlterPartitionAssignmentsResponse
	v.Default()
	return v
}

type ListPartitionReassignmentsRequestTopic struct {
	// Topic is a topic to list in progress partition reassingments of.
	Topic string

	// Partitions are partitions to list in progress reassignments of.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListPartitionReassignmentsRequestTopic.
func (v *ListPartitionReassignmentsRequestTopic) Default() {
}

// NewListPartitionReassignmentsRequestTopic returns a default ListPartitionReassignmentsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewListPartitionReassignmentsRequestTopic() ListPartitionReassignmentsRequestTopic {
	var v ListPartitionReassignmentsRequestTopic
	v.Default()
	return v
}

// ListPartitionReassignmentsRequest, proposed in KIP-455 and implemented in
// Kafka 2.4.0, is a request to list in progress partition reassignments.
//
// ACL wise, this requires DESCRIBE on CLUSTER.
type ListPartitionReassignmentsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 60000.
	TimeoutMillis int32

	// Topics are topics to list in progress partition reassignments of, or null
	// to list everything.
	Topics []ListPartitionReassignmentsRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListPartitionReassignmentsRequest) Key() int16                 { return 46 }
func (*ListPartitionReassignmentsRequest) MaxVersion() int16          { return 0 }
func (v *ListPartitionReassignmentsRequest) SetVersion(version int16) { v.Version = version }
func (v *ListPartitionReassignmentsRequest) GetVersion() int16        { return v.Version }
func (v *ListPartitionReassignmentsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListPartitionReassignmentsRequest) Timeout() int32           { return v.TimeoutMillis }
func (v *ListPartitionReassignmentsRequest) SetTimeout(timeoutMillis int32) {
	v.TimeoutMillis = timeoutMillis
}
func (v *ListPartitionReassignmentsRequest) IsAdminRequest() {}
func (v *ListPartitionReassignmentsRequest) ResponseKind() Response {
	r := &ListPartitionReassignmentsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ListPartitionReassignmentsRequest) RequestWith(ctx context.Context, r Requestor) (*ListPartitionReassignmentsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ListPartitionReassignmentsResponse)
	return resp, err
}

func (v *ListPartitionReassignmentsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListPartitionReassignmentsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListPartitionReassignmentsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListPartitionReassignmentsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []ListPartitionReassignmentsRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListPartitionReassignmentsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListPartitionReassignmentsRequest returns a pointer to a default ListPartitionReassignmentsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListPartitionReassignmentsRequest() *ListPartitionReassignmentsRequest {
	var v ListPartitionReassignmentsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListPartitionReassignmentsRequest.
func (v *ListPartitionReassignmentsRequest) Default() {
	v.TimeoutMillis = 60000
}

// NewListPartitionReassignmentsRequest returns a default ListPartitionReassignmentsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewListPartitionReassignmentsRequest() ListPartitionReassignmentsRequest {
	var v ListPartitionReassignmentsRequest
	v.Default()
	return v
}

type ListPartitionReassignmentsResponseTopicPartition struct {
	// Partition is the partition being responded to.
	Partition int32

	// Replicas is the partition's current replicas.
	Replicas []int32

	// AddingReplicas are replicas currently being added to the partition.
	AddingReplicas []int32

	// RemovingReplicas are replicas currently being removed from the partition.
	RemovingReplicas []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListPartitionReassignmentsResponseTopicPartition.
func (v *ListPartitionReassignmentsResponseTopicPartition) Default() {
}

// NewListPartitionReassignmentsResponseTopicPartition returns a default ListPartitionReassignmentsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewListPartitionReassignmentsResponseTopicPartition() ListPartitionReassignmentsResponseTopicPartition {
	var v ListPartitionReassignmentsResponseTopicPartition
	v.Default()
	return v
}

type ListPartitionReassignmentsResponseTopic struct {
	// Topic is the topic being responded to.
	Topic string

	// Partitions contains responses for partitions.
	Partitions []ListPartitionReassignmentsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListPartitionReassignmentsResponseTopic.
func (v *ListPartitionReassignmentsResponseTopic) Default() {
}

// NewListPartitionReassignmentsResponseTopic returns a default ListPartitionReassignmentsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewListPartitionReassignmentsResponseTopic() ListPartitionReassignmentsResponseTopic {
	var v ListPartitionReassignmentsResponseTopic
	v.Default()
	return v
}

// ListPartitionReassignmentsResponse is returned for a ListPartitionReassignmentsRequest.
type ListPartitionReassignmentsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the error code returned for listing reassignments.
	//
	// REQUEST_TIMED_OUT is returned if the request timed out.
	//
	// NOT_CONTROLLER is returned if the request was not issued to a Kafka
	// controller.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if the client is not
	// authorized to reassign partitions.
	ErrorCode int16

	// ErrorMessage is any global (applied to all partitions) error message.
	ErrorMessage *string

	// Topics contains responses for each topic requested.
	Topics []ListPartitionReassignmentsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListPartitionReassignmentsResponse) Key() int16                 { return 46 }
func (*ListPartitionReassignmentsResponse) MaxVersion() int16          { return 0 }
func (v *ListPartitionReassignmentsResponse) SetVersion(version int16) { v.Version = version }
func (v *ListPartitionReassignmentsResponse) GetVersion() int16        { return v.Version }
func (v *ListPartitionReassignmentsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListPartitionReassignmentsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ListPartitionReassignmentsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ListPartitionReassignmentsResponse) RequestKind() Request {
	return &ListPartitionReassignmentsRequest{Version: v.Version}
}

func (v *ListPartitionReassignmentsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.AddingReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.RemovingReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListPartitionReassignmentsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListPartitionReassignmentsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListPartitionReassignmentsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListPartitionReassignmentsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ListPartitionReassignmentsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					{
						v := s.AddingReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.AddingReplicas = v
					}
					{
						v := s.RemovingReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.RemovingReplicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListPartitionReassignmentsResponse returns a pointer to a default ListPartitionReassignmentsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListPartitionReassignmentsResponse() *ListPartitionReassignmentsResponse {
	var v ListPartitionReassignmentsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListPartitionReassignmentsResponse.
func (v *ListPartitionReassignmentsResponse) Default() {
}

// NewListPartitionReassignmentsResponse returns a default ListPartitionReassignmentsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewListPartitionReassignmentsResponse() ListPartitionReassignmentsResponse {
	var v ListPartitionReassignmentsResponse
	v.Default()
	return v
}

type OffsetDeleteRequestTopicPartition struct {
	// Partition is a partition to delete offsets for.
	Partition int32
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteRequestTopicPartition.
func (v *OffsetDeleteRequestTopicPartition) Default() {
}

// NewOffsetDeleteRequestTopicPartition returns a default OffsetDeleteRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteRequestTopicPartition() OffsetDeleteRequestTopicPartition {
	var v OffsetDeleteRequestTopicPartition
	v.Default()
	return v
}

type OffsetDeleteRequestTopic struct {
	// Topic is a topic to delete offsets in.
	Topic string

	// Partitions are partitions to delete offsets for.
	Partitions []OffsetDeleteRequestTopicPartition
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteRequestTopic.
func (v *OffsetDeleteRequestTopic) Default() {
}

// NewOffsetDeleteRequestTopic returns a default OffsetDeleteRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteRequestTopic() OffsetDeleteRequestTopic {
	var v OffsetDeleteRequestTopic
	v.Default()
	return v
}

// OffsetDeleteRequest, proposed in KIP-496 and implemented in Kafka 2.4.0, is
// a request to delete group offsets.
//
// ACL wise, this requires DELETE on GROUP for the group and READ on TOPIC for
// each topic.
type OffsetDeleteRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group to delete offsets in.
	Group string

	// Topics are topics to delete offsets in.
	Topics []OffsetDeleteRequestTopic
}

func (*OffsetDeleteRequest) Key() int16                   { return 47 }
func (*OffsetDeleteRequest) MaxVersion() int16            { return 0 }
func (v *OffsetDeleteRequest) SetVersion(version int16)   { v.Version = version }
func (v *OffsetDeleteRequest) GetVersion() int16          { return v.Version }
func (v *OffsetDeleteRequest) IsFlexible() bool           { return false }
func (v *OffsetDeleteRequest) IsGroupCoordinatorRequest() {}
func (v *OffsetDeleteRequest) ResponseKind() Response {
	r := &OffsetDeleteResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *OffsetDeleteRequest) RequestWith(ctx context.Context, r Requestor) (*OffsetDeleteResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*OffsetDeleteResponse)
	return resp, err
}

func (v *OffsetDeleteRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.Group
		dst = kbin.AppendString(dst, v)
	}
	{
		v := v.Topics
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Partitions
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
				}
			}
		}
	}
	return dst
}

func (v *OffsetDeleteRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetDeleteRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetDeleteRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	s := v
	{
		var v string
		if unsafe {
			v = b.UnsafeString()
		} else {
			v = b.String()
		}
		s.Group = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetDeleteRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetDeleteRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
				}
				v = a
				s.Partitions = v
			}
		}
		v = a
		s.Topics = v
	}
	return b.Complete()
}

// NewPtrOffsetDeleteRequest returns a pointer to a default OffsetDeleteRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetDeleteRequest() *OffsetDeleteRequest {
	var v OffsetDeleteRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteRequest.
func (v *OffsetDeleteRequest) Default() {
}

// NewOffsetDeleteRequest returns a default OffsetDeleteRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteRequest() OffsetDeleteRequest {
	var v OffsetDeleteRequest
	v.Default()
	return v
}

type OffsetDeleteResponseTopicPartition struct {
	// Partition is the partition being responded to.
	Partition int32

	// ErrorCode is any per partition error code.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the client is not authorized
	// for the topic / partition.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the broker does not know of
	// the requested topic.
	//
	// GROUP_SUBSCRIBED_TO_TOPIC is returned if the topic is still subscribed to.
	ErrorCode int16
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteResponseTopicPartition.
func (v *OffsetDeleteResponseTopicPartition) Default() {
}

// NewOffsetDeleteResponseTopicPartition returns a default OffsetDeleteResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteResponseTopicPartition() OffsetDeleteResponseTopicPartition {
	var v OffsetDeleteResponseTopicPartition
	v.Default()
	return v
}

type OffsetDeleteResponseTopic struct {
	// Topic is the topic being responded to.
	Topic string

	// Partitions are partitions being responded to.
	Partitions []OffsetDeleteResponseTopicPartition
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteResponseTopic.
func (v *OffsetDeleteResponseTopic) Default() {
}

// NewOffsetDeleteResponseTopic returns a default OffsetDeleteResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteResponseTopic() OffsetDeleteResponseTopic {
	var v OffsetDeleteResponseTopic
	v.Default()
	return v
}

// OffsetDeleteResponse is a response to an offset delete request.
type OffsetDeleteResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ErrorCode is any group wide error.
	//
	// GROUP_AUTHORIZATION_FAILED is returned if the client is not authorized
	// for the group.
	//
	// INVALID_GROUP_ID is returned in the requested group ID is invalid.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is not available.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the group is loading.
	//
	// NOT_COORDINATOR is returned if the requested broker is not the coordinator
	// for the requested group.
	//
	// GROUP_ID_NOT_FOUND is returned if the group ID does not exist.
	ErrorCode int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Topics are responses to requested topics.
	Topics []OffsetDeleteResponseTopic
}

func (*OffsetDeleteResponse) Key() int16                         { return 47 }
func (*OffsetDeleteResponse) MaxVersion() int16                  { return 0 }
func (v *OffsetDeleteResponse) SetVersion(version int16)         { v.Version = version }
func (v *OffsetDeleteResponse) GetVersion() int16                { return v.Version }
func (v *OffsetDeleteResponse) IsFlexible() bool                 { return false }
func (v *OffsetDeleteResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *OffsetDeleteResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *OffsetDeleteResponse) RequestKind() Request             { return &OffsetDeleteRequest{Version: v.Version} }

func (v *OffsetDeleteResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		dst = kbin.AppendArrayLen(dst, len(v))
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				dst = kbin.AppendString(dst, v)
			}
			{
				v := v.Partitions
				dst = kbin.AppendArrayLen(dst, len(v))
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
				}
			}
		}
	}
	return dst
}

func (v *OffsetDeleteResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *OffsetDeleteResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *OffsetDeleteResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		l = b.ArrayLen()
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]OffsetDeleteResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					v = b.UnsafeString()
				} else {
					v = b.String()
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				l = b.ArrayLen()
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]OffsetDeleteResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
				}
				v = a
				s.Partitions = v
			}
		}
		v = a
		s.Topics = v
	}
	return b.Complete()
}

// NewPtrOffsetDeleteResponse returns a pointer to a default OffsetDeleteResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrOffsetDeleteResponse() *OffsetDeleteResponse {
	var v OffsetDeleteResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to OffsetDeleteResponse.
func (v *OffsetDeleteResponse) Default() {
}

// NewOffsetDeleteResponse returns a default OffsetDeleteResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewOffsetDeleteResponse() OffsetDeleteResponse {
	var v OffsetDeleteResponse
	v.Default()
	return v
}

type DescribeClientQuotasRequestComponent struct {
	// EntityType is the entity component type that this filter component
	// applies to; some possible values are "user" or "client-id".
	EntityType string

	// MatchType specifies how to match an entity,
	// with 0 meaning match on the name exactly,
	// 1 meaning match on the default name,
	// and 2 meaning any specified name.
	MatchType QuotasMatchType

	// Match is the string to match against, or null if unused for the given
	// match type.
	Match *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasRequestComponent.
func (v *DescribeClientQuotasRequestComponent) Default() {
}

// NewDescribeClientQuotasRequestComponent returns a default DescribeClientQuotasRequestComponent
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasRequestComponent() DescribeClientQuotasRequestComponent {
	var v DescribeClientQuotasRequestComponent
	v.Default()
	return v
}

// DescribeClientQuotasRequest, proposed in KIP-546 and introduced with Kafka 2.6.0,
// provides a way to describe client quotas.
type DescribeClientQuotasRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Components is a list of match filters to apply for describing quota entities.
	Components []DescribeClientQuotasRequestComponent

	// Strict signifies whether matches are strict; if true, the response
	// excludes entities with unspecified entity types.
	Strict bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*DescribeClientQuotasRequest) Key() int16                 { return 48 }
func (*DescribeClientQuotasRequest) MaxVersion() int16          { return 1 }
func (v *DescribeClientQuotasRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeClientQuotasRequest) GetVersion() int16        { return v.Version }
func (v *DescribeClientQuotasRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *DescribeClientQuotasRequest) ResponseKind() Response {
	r := &DescribeClientQuotasResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeClientQuotasRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeClientQuotasResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeClientQuotasResponse)
	return resp, err
}

func (v *DescribeClientQuotasRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Components
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.EntityType
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.MatchType
				{
					v := int8(v)
					dst = kbin.AppendInt8(dst, v)
				}
			}
			{
				v := v.Match
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.Strict
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeClientQuotasRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeClientQuotasRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeClientQuotasRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := s.Components
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeClientQuotasRequestComponent, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.EntityType = v
			}
			{
				var t QuotasMatchType
				{
					v := b.Int8()
					t = QuotasMatchType(v)
				}
				v := t
				s.MatchType = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Match = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Components = v
	}
	{
		v := b.Bool()
		s.Strict = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeClientQuotasRequest returns a pointer to a default DescribeClientQuotasRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeClientQuotasRequest() *DescribeClientQuotasRequest {
	var v DescribeClientQuotasRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasRequest.
func (v *DescribeClientQuotasRequest) Default() {
}

// NewDescribeClientQuotasRequest returns a default DescribeClientQuotasRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasRequest() DescribeClientQuotasRequest {
	var v DescribeClientQuotasRequest
	v.Default()
	return v
}

type DescribeClientQuotasResponseEntryEntity struct {
	// Type is the entity type.
	Type string

	// Name is the entity name, or null if the default.
	Name *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasResponseEntryEntity.
func (v *DescribeClientQuotasResponseEntryEntity) Default() {
}

// NewDescribeClientQuotasResponseEntryEntity returns a default DescribeClientQuotasResponseEntryEntity
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasResponseEntryEntity() DescribeClientQuotasResponseEntryEntity {
	var v DescribeClientQuotasResponseEntryEntity
	v.Default()
	return v
}

type DescribeClientQuotasResponseEntryValue struct {
	// Key is the quota configuration key.
	Key string

	// Value is the quota configuration value.
	Value float64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasResponseEntryValue.
func (v *DescribeClientQuotasResponseEntryValue) Default() {
}

// NewDescribeClientQuotasResponseEntryValue returns a default DescribeClientQuotasResponseEntryValue
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasResponseEntryValue() DescribeClientQuotasResponseEntryValue {
	var v DescribeClientQuotasResponseEntryValue
	v.Default()
	return v
}

type DescribeClientQuotasResponseEntry struct {
	// Entity contains the quota entity components being described.
	Entity []DescribeClientQuotasResponseEntryEntity

	// Values are quota values for the entity.
	Values []DescribeClientQuotasResponseEntryValue

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasResponseEntry.
func (v *DescribeClientQuotasResponseEntry) Default() {
}

// NewDescribeClientQuotasResponseEntry returns a default DescribeClientQuotasResponseEntry
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasResponseEntry() DescribeClientQuotasResponseEntry {
	var v DescribeClientQuotasResponseEntry
	v.Default()
	return v
}

// DescribeClientQuotasResponse is a response for a DescribeClientQuotasRequest.
type DescribeClientQuotasResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is any error for the request.
	ErrorCode int16

	// ErrorMessage is an error message for the request, or null if the request succeeded.
	ErrorMessage *string

	// Entries contains entities that were matched.
	Entries []DescribeClientQuotasResponseEntry

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*DescribeClientQuotasResponse) Key() int16                 { return 48 }
func (*DescribeClientQuotasResponse) MaxVersion() int16          { return 1 }
func (v *DescribeClientQuotasResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeClientQuotasResponse) GetVersion() int16        { return v.Version }
func (v *DescribeClientQuotasResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *DescribeClientQuotasResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DescribeClientQuotasResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeClientQuotasResponse) RequestKind() Request {
	return &DescribeClientQuotasRequest{Version: v.Version}
}

func (v *DescribeClientQuotasResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Entries
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Entity
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Type
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.Values
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Key
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						dst = kbin.AppendFloat64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeClientQuotasResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeClientQuotasResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeClientQuotasResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Entries
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []DescribeClientQuotasResponseEntry{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeClientQuotasResponseEntry, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := s.Entity
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeClientQuotasResponseEntryEntity, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Type = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Name = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Entity = v
			}
			{
				v := s.Values
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeClientQuotasResponseEntryValue, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Key = v
					}
					{
						v := b.Float64()
						s.Value = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Values = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Entries = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeClientQuotasResponse returns a pointer to a default DescribeClientQuotasResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeClientQuotasResponse() *DescribeClientQuotasResponse {
	var v DescribeClientQuotasResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClientQuotasResponse.
func (v *DescribeClientQuotasResponse) Default() {
}

// NewDescribeClientQuotasResponse returns a default DescribeClientQuotasResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClientQuotasResponse() DescribeClientQuotasResponse {
	var v DescribeClientQuotasResponse
	v.Default()
	return v
}

type AlterClientQuotasRequestEntryEntity struct {
	// Type is the entity component's type; e.g. "client-id", "user" or "ip".
	Type string

	// Name is the name of the entity, or null for the default.
	Name *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasRequestEntryEntity.
func (v *AlterClientQuotasRequestEntryEntity) Default() {
}

// NewAlterClientQuotasRequestEntryEntity returns a default AlterClientQuotasRequestEntryEntity
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasRequestEntryEntity() AlterClientQuotasRequestEntryEntity {
	var v AlterClientQuotasRequestEntryEntity
	v.Default()
	return v
}

type AlterClientQuotasRequestEntryOp struct {
	// Key is the quota configuration key to alter.
	Key string

	// Value is the value to set; ignored if remove is true.
	Value float64

	// Remove is whether the quota configuration value should be removed or set.
	Remove bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasRequestEntryOp.
func (v *AlterClientQuotasRequestEntryOp) Default() {
}

// NewAlterClientQuotasRequestEntryOp returns a default AlterClientQuotasRequestEntryOp
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasRequestEntryOp() AlterClientQuotasRequestEntryOp {
	var v AlterClientQuotasRequestEntryOp
	v.Default()
	return v
}

type AlterClientQuotasRequestEntry struct {
	// Entity contains the components of a quota entity to alter.
	Entity []AlterClientQuotasRequestEntryEntity

	// Ops contains quota configuration entries to alter.
	Ops []AlterClientQuotasRequestEntryOp

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasRequestEntry.
func (v *AlterClientQuotasRequestEntry) Default() {
}

// NewAlterClientQuotasRequestEntry returns a default AlterClientQuotasRequestEntry
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasRequestEntry() AlterClientQuotasRequestEntry {
	var v AlterClientQuotasRequestEntry
	v.Default()
	return v
}

// AlterClientQuotaRequest, proposed in KIP-546 and introduced with Kafka 2.6.0,
// provides a way to alter client quotas.
type AlterClientQuotasRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Entries are quota configuration entries to alter.
	Entries []AlterClientQuotasRequestEntry

	// ValidateOnly is makes this request a dry-run; the alteration is validated
	// but not performed.
	ValidateOnly bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*AlterClientQuotasRequest) Key() int16                 { return 49 }
func (*AlterClientQuotasRequest) MaxVersion() int16          { return 1 }
func (v *AlterClientQuotasRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterClientQuotasRequest) GetVersion() int16        { return v.Version }
func (v *AlterClientQuotasRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *AlterClientQuotasRequest) ResponseKind() Response {
	r := &AlterClientQuotasResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterClientQuotasRequest) RequestWith(ctx context.Context, r Requestor) (*AlterClientQuotasResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterClientQuotasResponse)
	return resp, err
}

func (v *AlterClientQuotasRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.Entries
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Entity
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Type
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.Ops
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Key
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Value
						dst = kbin.AppendFloat64(dst, v)
					}
					{
						v := v.Remove
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterClientQuotasRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterClientQuotasRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterClientQuotasRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := s.Entries
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterClientQuotasRequestEntry, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := s.Entity
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterClientQuotasRequestEntryEntity, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Type = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Name = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Entity = v
			}
			{
				v := s.Ops
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterClientQuotasRequestEntryOp, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Key = v
					}
					{
						v := b.Float64()
						s.Value = v
					}
					{
						v := b.Bool()
						s.Remove = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Ops = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Entries = v
	}
	{
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterClientQuotasRequest returns a pointer to a default AlterClientQuotasRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterClientQuotasRequest() *AlterClientQuotasRequest {
	var v AlterClientQuotasRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasRequest.
func (v *AlterClientQuotasRequest) Default() {
}

// NewAlterClientQuotasRequest returns a default AlterClientQuotasRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasRequest() AlterClientQuotasRequest {
	var v AlterClientQuotasRequest
	v.Default()
	return v
}

type AlterClientQuotasResponseEntryEntity struct {
	// Type is the entity component's type; e.g. "client-id" or "user".
	Type string

	// Name is the name of the entity, or null for the default.
	Name *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasResponseEntryEntity.
func (v *AlterClientQuotasResponseEntryEntity) Default() {
}

// NewAlterClientQuotasResponseEntryEntity returns a default AlterClientQuotasResponseEntryEntity
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasResponseEntryEntity() AlterClientQuotasResponseEntryEntity {
	var v AlterClientQuotasResponseEntryEntity
	v.Default()
	return v
}

type AlterClientQuotasResponseEntry struct {
	// ErrorCode is the error code for an alter on a matched entity.
	ErrorCode int16

	// ErrorMessage is an informative message if the alter on this entity failed.
	ErrorMessage *string

	// Entity contains the components of a matched entity.
	Entity []AlterClientQuotasResponseEntryEntity

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasResponseEntry.
func (v *AlterClientQuotasResponseEntry) Default() {
}

// NewAlterClientQuotasResponseEntry returns a default AlterClientQuotasResponseEntry
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasResponseEntry() AlterClientQuotasResponseEntry {
	var v AlterClientQuotasResponseEntry
	v.Default()
	return v
}

// AlterClientQuotasResponse is a response to an AlterClientQuotasRequest.
type AlterClientQuotasResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Entries contains results for the alter request.
	Entries []AlterClientQuotasResponseEntry

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*AlterClientQuotasResponse) Key() int16                 { return 49 }
func (*AlterClientQuotasResponse) MaxVersion() int16          { return 1 }
func (v *AlterClientQuotasResponse) SetVersion(version int16) { v.Version = version }
func (v *AlterClientQuotasResponse) GetVersion() int16        { return v.Version }
func (v *AlterClientQuotasResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *AlterClientQuotasResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *AlterClientQuotasResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AlterClientQuotasResponse) RequestKind() Request {
	return &AlterClientQuotasRequest{Version: v.Version}
}

func (v *AlterClientQuotasResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Entries
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Entity
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Type
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterClientQuotasResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterClientQuotasResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterClientQuotasResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Entries
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterClientQuotasResponseEntry, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				v := s.Entity
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterClientQuotasResponseEntryEntity, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Type = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.Name = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Entity = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Entries = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterClientQuotasResponse returns a pointer to a default AlterClientQuotasResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterClientQuotasResponse() *AlterClientQuotasResponse {
	var v AlterClientQuotasResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterClientQuotasResponse.
func (v *AlterClientQuotasResponse) Default() {
}

// NewAlterClientQuotasResponse returns a default AlterClientQuotasResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterClientQuotasResponse() AlterClientQuotasResponse {
	var v AlterClientQuotasResponse
	v.Default()
	return v
}

type DescribeUserSCRAMCredentialsRequestUser struct {
	// The user name.
	Name string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeUserSCRAMCredentialsRequestUser.
func (v *DescribeUserSCRAMCredentialsRequestUser) Default() {
}

// NewDescribeUserSCRAMCredentialsRequestUser returns a default DescribeUserSCRAMCredentialsRequestUser
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeUserSCRAMCredentialsRequestUser() DescribeUserSCRAMCredentialsRequestUser {
	var v DescribeUserSCRAMCredentialsRequestUser
	v.Default()
	return v
}

// DescribeUserSCRAMCredentialsRequest, proposed in KIP-554 and introduced
// with Kafka 2.7.0, describes user SCRAM credentials.
//
// This request was introduced as part of the overarching KIP-500 initiative,
// which is to remove Zookeeper as a dependency.
//
// This request requires DESCRIBE on CLUSTER.
type DescribeUserSCRAMCredentialsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The users to describe, or null to describe all.
	Users []DescribeUserSCRAMCredentialsRequestUser

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeUserSCRAMCredentialsRequest) Key() int16                 { return 50 }
func (*DescribeUserSCRAMCredentialsRequest) MaxVersion() int16          { return 0 }
func (v *DescribeUserSCRAMCredentialsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeUserSCRAMCredentialsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeUserSCRAMCredentialsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeUserSCRAMCredentialsRequest) ResponseKind() Response {
	r := &DescribeUserSCRAMCredentialsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeUserSCRAMCredentialsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeUserSCRAMCredentialsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeUserSCRAMCredentialsResponse)
	return resp, err
}

func (v *DescribeUserSCRAMCredentialsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Users
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeUserSCRAMCredentialsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeUserSCRAMCredentialsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeUserSCRAMCredentialsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Users
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []DescribeUserSCRAMCredentialsRequestUser{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeUserSCRAMCredentialsRequestUser, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Users = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeUserSCRAMCredentialsRequest returns a pointer to a default DescribeUserSCRAMCredentialsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeUserSCRAMCredentialsRequest() *DescribeUserSCRAMCredentialsRequest {
	var v DescribeUserSCRAMCredentialsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeUserSCRAMCredentialsRequest.
func (v *DescribeUserSCRAMCredentialsRequest) Default() {
}

// NewDescribeUserSCRAMCredentialsRequest returns a default DescribeUserSCRAMCredentialsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeUserSCRAMCredentialsRequest() DescribeUserSCRAMCredentialsRequest {
	var v DescribeUserSCRAMCredentialsRequest
	v.Default()
	return v
}

type DescribeUserSCRAMCredentialsResponseResultCredentialInfo struct {
	// The SCRAM mechanism for this user, where 0 is UNKNOWN, 1 is SCRAM-SHA-256,
	// and 2 is SCRAM-SHA-512.
	Mechanism int8

	// The number of iterations used in the SCRAM credential.
	Iterations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeUserSCRAMCredentialsResponseResultCredentialInfo.
func (v *DescribeUserSCRAMCredentialsResponseResultCredentialInfo) Default() {
}

// NewDescribeUserSCRAMCredentialsResponseResultCredentialInfo returns a default DescribeUserSCRAMCredentialsResponseResultCredentialInfo
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeUserSCRAMCredentialsResponseResultCredentialInfo() DescribeUserSCRAMCredentialsResponseResultCredentialInfo {
	var v DescribeUserSCRAMCredentialsResponseResultCredentialInfo
	v.Default()
	return v
}

type DescribeUserSCRAMCredentialsResponseResult struct {
	// The name this result corresponds to.
	User string

	// The user-level error code.
	//
	// RESOURCE_NOT_FOUND if the user does not exist or has no credentials.
	//
	// DUPLICATE_RESOURCE if the user is requested twice+.
	ErrorCode int16

	// The user-level error message, if any.
	ErrorMessage *string

	// Information about the SCRAM credentials for this user.
	CredentialInfos []DescribeUserSCRAMCredentialsResponseResultCredentialInfo

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeUserSCRAMCredentialsResponseResult.
func (v *DescribeUserSCRAMCredentialsResponseResult) Default() {
}

// NewDescribeUserSCRAMCredentialsResponseResult returns a default DescribeUserSCRAMCredentialsResponseResult
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeUserSCRAMCredentialsResponseResult() DescribeUserSCRAMCredentialsResponseResult {
	var v DescribeUserSCRAMCredentialsResponseResult
	v.Default()
	return v
}

// DescribeUserSCRAMCredentialsResponse is a response for a
// DescribeUserSCRAMCredentialsRequest.
type DescribeUserSCRAMCredentialsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The request-level error code. This is 0 except for auth or infra issues.
	//
	// CLUSTER_AUTHORIZATION_FAILED if you do not have DESCRIBE on CLUSTER.
	ErrorCode int16

	// The request-level error message, if any.
	ErrorMessage *string

	// Results for descriptions, one per user.
	Results []DescribeUserSCRAMCredentialsResponseResult

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeUserSCRAMCredentialsResponse) Key() int16                 { return 50 }
func (*DescribeUserSCRAMCredentialsResponse) MaxVersion() int16          { return 0 }
func (v *DescribeUserSCRAMCredentialsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeUserSCRAMCredentialsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeUserSCRAMCredentialsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeUserSCRAMCredentialsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DescribeUserSCRAMCredentialsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeUserSCRAMCredentialsResponse) RequestKind() Request {
	return &DescribeUserSCRAMCredentialsRequest{Version: v.Version}
}

func (v *DescribeUserSCRAMCredentialsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Results
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.User
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.CredentialInfos
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Mechanism
						dst = kbin.AppendInt8(dst, v)
					}
					{
						v := v.Iterations
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeUserSCRAMCredentialsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeUserSCRAMCredentialsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeUserSCRAMCredentialsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Results
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeUserSCRAMCredentialsResponseResult, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.User = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				v := s.CredentialInfos
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeUserSCRAMCredentialsResponseResultCredentialInfo, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int8()
						s.Mechanism = v
					}
					{
						v := b.Int32()
						s.Iterations = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.CredentialInfos = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Results = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeUserSCRAMCredentialsResponse returns a pointer to a default DescribeUserSCRAMCredentialsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeUserSCRAMCredentialsResponse() *DescribeUserSCRAMCredentialsResponse {
	var v DescribeUserSCRAMCredentialsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeUserSCRAMCredentialsResponse.
func (v *DescribeUserSCRAMCredentialsResponse) Default() {
}

// NewDescribeUserSCRAMCredentialsResponse returns a default DescribeUserSCRAMCredentialsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeUserSCRAMCredentialsResponse() DescribeUserSCRAMCredentialsResponse {
	var v DescribeUserSCRAMCredentialsResponse
	v.Default()
	return v
}

type AlterUserSCRAMCredentialsRequestDeletion struct {
	// The user name to match for removal.
	Name string

	// The mechanism for the user name to remove.
	Mechanism int8

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterUserSCRAMCredentialsRequestDeletion.
func (v *AlterUserSCRAMCredentialsRequestDeletion) Default() {
}

// NewAlterUserSCRAMCredentialsRequestDeletion returns a default AlterUserSCRAMCredentialsRequestDeletion
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterUserSCRAMCredentialsRequestDeletion() AlterUserSCRAMCredentialsRequestDeletion {
	var v AlterUserSCRAMCredentialsRequestDeletion
	v.Default()
	return v
}

type AlterUserSCRAMCredentialsRequestUpsertion struct {
	// The user name to use.
	Name string

	// The mechanism to use for creating, where 1 is SCRAM-SHA-256 and 2 is
	// SCRAM-SHA-512.
	Mechanism int8

	// The number of iterations to use. This must be more than the minimum for
	// the mechanism and cannot be more than 16384.
	Iterations int32

	// A random salt generated by the client.
	Salt []byte

	// The salted password to use.
	SaltedPassword []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterUserSCRAMCredentialsRequestUpsertion.
func (v *AlterUserSCRAMCredentialsRequestUpsertion) Default() {
}

// NewAlterUserSCRAMCredentialsRequestUpsertion returns a default AlterUserSCRAMCredentialsRequestUpsertion
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterUserSCRAMCredentialsRequestUpsertion() AlterUserSCRAMCredentialsRequestUpsertion {
	var v AlterUserSCRAMCredentialsRequestUpsertion
	v.Default()
	return v
}

// AlterUserSCRAMCredentialsRequest, proposed in KIP-554 and introduced
// with Kafka 2.7.0, alters or deletes user SCRAM credentials.
//
// This request was introduced as part of the overarching KIP-500 initiative,
// which is to remove Zookeeper as a dependency.
//
// This request requires ALTER on CLUSTER.
type AlterUserSCRAMCredentialsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The SCRAM credentials to remove.
	Deletions []AlterUserSCRAMCredentialsRequestDeletion

	// The SCRAM credentials to update or insert.
	Upsertions []AlterUserSCRAMCredentialsRequestUpsertion

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterUserSCRAMCredentialsRequest) Key() int16                 { return 51 }
func (*AlterUserSCRAMCredentialsRequest) MaxVersion() int16          { return 0 }
func (v *AlterUserSCRAMCredentialsRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterUserSCRAMCredentialsRequest) GetVersion() int16        { return v.Version }
func (v *AlterUserSCRAMCredentialsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterUserSCRAMCredentialsRequest) IsAdminRequest()          {}
func (v *AlterUserSCRAMCredentialsRequest) ResponseKind() Response {
	r := &AlterUserSCRAMCredentialsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterUserSCRAMCredentialsRequest) RequestWith(ctx context.Context, r Requestor) (*AlterUserSCRAMCredentialsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterUserSCRAMCredentialsResponse)
	return resp, err
}

func (v *AlterUserSCRAMCredentialsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Deletions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Mechanism
				dst = kbin.AppendInt8(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.Upsertions
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Mechanism
				dst = kbin.AppendInt8(dst, v)
			}
			{
				v := v.Iterations
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Salt
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			{
				v := v.SaltedPassword
				if isFlexible {
					dst = kbin.AppendCompactBytes(dst, v)
				} else {
					dst = kbin.AppendBytes(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterUserSCRAMCredentialsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterUserSCRAMCredentialsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterUserSCRAMCredentialsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Deletions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterUserSCRAMCredentialsRequestDeletion, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				v := b.Int8()
				s.Mechanism = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Deletions = v
	}
	{
		v := s.Upsertions
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterUserSCRAMCredentialsRequestUpsertion, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				v := b.Int8()
				s.Mechanism = v
			}
			{
				v := b.Int32()
				s.Iterations = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.Salt = v
			}
			{
				var v []byte
				if isFlexible {
					v = b.CompactBytes()
				} else {
					v = b.Bytes()
				}
				s.SaltedPassword = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Upsertions = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterUserSCRAMCredentialsRequest returns a pointer to a default AlterUserSCRAMCredentialsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterUserSCRAMCredentialsRequest() *AlterUserSCRAMCredentialsRequest {
	var v AlterUserSCRAMCredentialsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterUserSCRAMCredentialsRequest.
func (v *AlterUserSCRAMCredentialsRequest) Default() {
}

// NewAlterUserSCRAMCredentialsRequest returns a default AlterUserSCRAMCredentialsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterUserSCRAMCredentialsRequest() AlterUserSCRAMCredentialsRequest {
	var v AlterUserSCRAMCredentialsRequest
	v.Default()
	return v
}

type AlterUserSCRAMCredentialsResponseResult struct {
	// The name this result corresponds to.
	User string

	// The user-level error code.
	ErrorCode int16

	// The user-level error message, if any.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterUserSCRAMCredentialsResponseResult.
func (v *AlterUserSCRAMCredentialsResponseResult) Default() {
}

// NewAlterUserSCRAMCredentialsResponseResult returns a default AlterUserSCRAMCredentialsResponseResult
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterUserSCRAMCredentialsResponseResult() AlterUserSCRAMCredentialsResponseResult {
	var v AlterUserSCRAMCredentialsResponseResult
	v.Default()
	return v
}

// AlterUserSCRAMCredentialsResponse is a response for an
// AlterUserSCRAMCredentialsRequest.
type AlterUserSCRAMCredentialsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The results for deletions and upsertions.
	Results []AlterUserSCRAMCredentialsResponseResult

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterUserSCRAMCredentialsResponse) Key() int16                 { return 51 }
func (*AlterUserSCRAMCredentialsResponse) MaxVersion() int16          { return 0 }
func (v *AlterUserSCRAMCredentialsResponse) SetVersion(version int16) { v.Version = version }
func (v *AlterUserSCRAMCredentialsResponse) GetVersion() int16        { return v.Version }
func (v *AlterUserSCRAMCredentialsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterUserSCRAMCredentialsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *AlterUserSCRAMCredentialsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AlterUserSCRAMCredentialsResponse) RequestKind() Request {
	return &AlterUserSCRAMCredentialsRequest{Version: v.Version}
}

func (v *AlterUserSCRAMCredentialsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Results
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.User
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterUserSCRAMCredentialsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterUserSCRAMCredentialsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterUserSCRAMCredentialsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Results
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterUserSCRAMCredentialsResponseResult, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.User = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Results = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterUserSCRAMCredentialsResponse returns a pointer to a default AlterUserSCRAMCredentialsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterUserSCRAMCredentialsResponse() *AlterUserSCRAMCredentialsResponse {
	var v AlterUserSCRAMCredentialsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterUserSCRAMCredentialsResponse.
func (v *AlterUserSCRAMCredentialsResponse) Default() {
}

// NewAlterUserSCRAMCredentialsResponse returns a default AlterUserSCRAMCredentialsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterUserSCRAMCredentialsResponse() AlterUserSCRAMCredentialsResponse {
	var v AlterUserSCRAMCredentialsResponse
	v.Default()
	return v
}

type VoteRequestTopicPartition struct {
	Partition int32

	// The bumped epoch of the voter sending the request.
	CandidateEpoch int32

	// The ID of the voter sending the request.
	CandidateID int32

	// The directory ID of the voter sending the request.
	CandidateDirectoryID [16]byte // v1+

	// The directory ID of the voter receiving the request.
	VoterDirectoryID [16]byte // v1+

	// The epoch of the last record written to the metadata log.
	LastOffsetEpoch int32

	// The offset of the last record written to the metadata log.
	LastOffset int64

	// Whether the request is a PreVote request (not persisted) or not.
	PreVote bool // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteRequestTopicPartition.
func (v *VoteRequestTopicPartition) Default() {
}

// NewVoteRequestTopicPartition returns a default VoteRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteRequestTopicPartition() VoteRequestTopicPartition {
	var v VoteRequestTopicPartition
	v.Default()
	return v
}

type VoteRequestTopic struct {
	Topic string

	Partitions []VoteRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteRequestTopic.
func (v *VoteRequestTopic) Default() {
}

// NewVoteRequestTopic returns a default VoteRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteRequestTopic() VoteRequestTopic {
	var v VoteRequestTopic
	v.Default()
	return v
}

// Part of KIP-595 to replace Kafka's dependence on Zookeeper with a
// Kafka-only raft protocol,
// VoteRequest is used by voters to hold a leader election.
//
// Since this is relatively Kafka internal, most fields are left undocumented.
type VoteRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ClusterID *string

	// This field has a default of -1.
	VoterID int32 // v1+

	Topics []VoteRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*VoteRequest) Key() int16                 { return 52 }
func (*VoteRequest) MaxVersion() int16          { return 2 }
func (v *VoteRequest) SetVersion(version int16) { v.Version = version }
func (v *VoteRequest) GetVersion() int16        { return v.Version }
func (v *VoteRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *VoteRequest) IsAdminRequest()          {}
func (v *VoteRequest) ResponseKind() Response {
	r := &VoteResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *VoteRequest) RequestWith(ctx context.Context, r Requestor) (*VoteResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*VoteResponse)
	return resp, err
}

func (v *VoteRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.VoterID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.CandidateEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.CandidateID
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 1 {
						v := v.CandidateDirectoryID
						dst = kbin.AppendUuid(dst, v)
					}
					if version >= 1 {
						v := v.VoterDirectoryID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.LastOffsetEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LastOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 2 {
						v := v.PreVote
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *VoteRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *VoteRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *VoteRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	if version >= 1 {
		v := b.Int32()
		s.VoterID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]VoteRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]VoteRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.CandidateEpoch = v
					}
					{
						v := b.Int32()
						s.CandidateID = v
					}
					if version >= 1 {
						v := b.Uuid()
						s.CandidateDirectoryID = v
					}
					if version >= 1 {
						v := b.Uuid()
						s.VoterDirectoryID = v
					}
					{
						v := b.Int32()
						s.LastOffsetEpoch = v
					}
					{
						v := b.Int64()
						s.LastOffset = v
					}
					if version >= 2 {
						v := b.Bool()
						s.PreVote = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrVoteRequest returns a pointer to a default VoteRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrVoteRequest() *VoteRequest {
	var v VoteRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteRequest.
func (v *VoteRequest) Default() {
	v.VoterID = -1
}

// NewVoteRequest returns a default VoteRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteRequest() VoteRequest {
	var v VoteRequest
	v.Default()
	return v
}

type VoteResponseTopicPartition struct {
	Partition int32

	ErrorCode int16

	// The ID of the current leader, or -1 if the leader is unknown.
	LeaderID int32

	// The latest known leader epoch.
	LeaderEpoch int32

	// Whether the vote was granted.
	VoteGranted bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteResponseTopicPartition.
func (v *VoteResponseTopicPartition) Default() {
}

// NewVoteResponseTopicPartition returns a default VoteResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteResponseTopicPartition() VoteResponseTopicPartition {
	var v VoteResponseTopicPartition
	v.Default()
	return v
}

type VoteResponseTopic struct {
	Topic string

	Partitions []VoteResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteResponseTopic.
func (v *VoteResponseTopic) Default() {
}

// NewVoteResponseTopic returns a default VoteResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteResponseTopic() VoteResponseTopic {
	var v VoteResponseTopic
	v.Default()
	return v
}

type VoteResponseNodeEndpoint struct {
	NodeID int32 // v1+

	Host string // v1+

	Port uint16 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteResponseNodeEndpoint.
func (v *VoteResponseNodeEndpoint) Default() {
}

// NewVoteResponseNodeEndpoint returns a default VoteResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteResponseNodeEndpoint() VoteResponseNodeEndpoint {
	var v VoteResponseNodeEndpoint
	v.Default()
	return v
}

type VoteResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	Topics []VoteResponseTopic

	// Endpoints for all leaders enumerated in PartitionData.
	NodeEndpoints []VoteResponseNodeEndpoint // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*VoteResponse) Key() int16                 { return 52 }
func (*VoteResponse) MaxVersion() int16          { return 2 }
func (v *VoteResponse) SetVersion(version int16) { v.Version = version }
func (v *VoteResponse) GetVersion() int16        { return v.Version }
func (v *VoteResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *VoteResponse) RequestKind() Request     { return &VoteRequest{Version: v.Version} }

func (v *VoteResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.VoteGranted
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.NodeEndpoints) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.NodeEndpoints
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fNodeEndpoints:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						if version >= 1 {
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						if version >= 1 {
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						if version >= 1 {
							v := v.Port
							dst = kbin.AppendUint16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fNodeEndpoints
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *VoteResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *VoteResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *VoteResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]VoteResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]VoteResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Bool()
						s.VoteGranted = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.NodeEndpoints
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]VoteResponseNodeEndpoint, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 1 {
						v := b.Int32()
						s.NodeID = v
					}
					if version >= 1 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					if version >= 1 {
						v := b.Uint16()
						s.Port = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.NodeEndpoints = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrVoteResponse returns a pointer to a default VoteResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrVoteResponse() *VoteResponse {
	var v VoteResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to VoteResponse.
func (v *VoteResponse) Default() {
}

// NewVoteResponse returns a default VoteResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewVoteResponse() VoteResponse {
	var v VoteResponse
	v.Default()
	return v
}

type BeginQuorumEpochRequestTopicPartition struct {
	Partition int32

	// Directory ID of the receiving replica.
	VoterDirectoryID [16]byte // v1+

	// The ID of the newly elected leader.
	LeaderID int32

	// The epoch of the newly elected leader.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochRequestTopicPartition.
func (v *BeginQuorumEpochRequestTopicPartition) Default() {
}

// NewBeginQuorumEpochRequestTopicPartition returns a default BeginQuorumEpochRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochRequestTopicPartition() BeginQuorumEpochRequestTopicPartition {
	var v BeginQuorumEpochRequestTopicPartition
	v.Default()
	return v
}

type BeginQuorumEpochRequestTopic struct {
	Topic string

	Partitions []BeginQuorumEpochRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochRequestTopic.
func (v *BeginQuorumEpochRequestTopic) Default() {
}

// NewBeginQuorumEpochRequestTopic returns a default BeginQuorumEpochRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochRequestTopic() BeginQuorumEpochRequestTopic {
	var v BeginQuorumEpochRequestTopic
	v.Default()
	return v
}

type BeginQuorumEpochRequestLeaderEndpoint struct {
	Name string

	Host string

	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochRequestLeaderEndpoint.
func (v *BeginQuorumEpochRequestLeaderEndpoint) Default() {
}

// NewBeginQuorumEpochRequestLeaderEndpoint returns a default BeginQuorumEpochRequestLeaderEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochRequestLeaderEndpoint() BeginQuorumEpochRequestLeaderEndpoint {
	var v BeginQuorumEpochRequestLeaderEndpoint
	v.Default()
	return v
}

// Part of KIP-595 to replace Kafka's dependence on Zookeeper with a
// Kafka-only raft protocol,
// BeginQuorumEpochRequest is sent by a leader (once it has enough votes)
// to all voters in the election.
//
// Since this is relatively Kafka internal, most fields are left undocumented.
type BeginQuorumEpochRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ClusterID *string

	// Replica ID of the voter receiving the request.
	//
	// This field has a default of -1.
	VoterID int32 // v1+

	Topics []BeginQuorumEpochRequestTopic

	// Endpoints for the leader.
	LeaderEndpoints []BeginQuorumEpochRequestLeaderEndpoint // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*BeginQuorumEpochRequest) Key() int16                 { return 53 }
func (*BeginQuorumEpochRequest) MaxVersion() int16          { return 1 }
func (v *BeginQuorumEpochRequest) SetVersion(version int16) { v.Version = version }
func (v *BeginQuorumEpochRequest) GetVersion() int16        { return v.Version }
func (v *BeginQuorumEpochRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *BeginQuorumEpochRequest) IsAdminRequest()          {}
func (v *BeginQuorumEpochRequest) ResponseKind() Response {
	r := &BeginQuorumEpochResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *BeginQuorumEpochRequest) RequestWith(ctx context.Context, r Requestor) (*BeginQuorumEpochResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*BeginQuorumEpochResponse)
	return resp, err
}

func (v *BeginQuorumEpochRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.VoterID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 1 {
						v := v.VoterDirectoryID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.LeaderEndpoints
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BeginQuorumEpochRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BeginQuorumEpochRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BeginQuorumEpochRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	if version >= 1 {
		v := b.Int32()
		s.VoterID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]BeginQuorumEpochRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]BeginQuorumEpochRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 1 {
						v := b.Uuid()
						s.VoterDirectoryID = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 1 {
		v := s.LeaderEndpoints
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]BeginQuorumEpochRequestLeaderEndpoint, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.LeaderEndpoints = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrBeginQuorumEpochRequest returns a pointer to a default BeginQuorumEpochRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBeginQuorumEpochRequest() *BeginQuorumEpochRequest {
	var v BeginQuorumEpochRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochRequest.
func (v *BeginQuorumEpochRequest) Default() {
	v.VoterID = -1
}

// NewBeginQuorumEpochRequest returns a default BeginQuorumEpochRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochRequest() BeginQuorumEpochRequest {
	var v BeginQuorumEpochRequest
	v.Default()
	return v
}

type BeginQuorumEpochResponseTopicPartition struct {
	Partition int32

	ErrorCode int16

	// The ID of the current leader, or -1 if the leader is unknown.
	LeaderID int32

	// The latest known leader epoch.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochResponseTopicPartition.
func (v *BeginQuorumEpochResponseTopicPartition) Default() {
}

// NewBeginQuorumEpochResponseTopicPartition returns a default BeginQuorumEpochResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochResponseTopicPartition() BeginQuorumEpochResponseTopicPartition {
	var v BeginQuorumEpochResponseTopicPartition
	v.Default()
	return v
}

type BeginQuorumEpochResponseTopic struct {
	Topic string

	Partitions []BeginQuorumEpochResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochResponseTopic.
func (v *BeginQuorumEpochResponseTopic) Default() {
}

// NewBeginQuorumEpochResponseTopic returns a default BeginQuorumEpochResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochResponseTopic() BeginQuorumEpochResponseTopic {
	var v BeginQuorumEpochResponseTopic
	v.Default()
	return v
}

type BeginQuorumEpochResponseNodeEndpoint struct {
	NodeID int32 // v1+

	Host string // v1+

	Port uint16 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochResponseNodeEndpoint.
func (v *BeginQuorumEpochResponseNodeEndpoint) Default() {
}

// NewBeginQuorumEpochResponseNodeEndpoint returns a default BeginQuorumEpochResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochResponseNodeEndpoint() BeginQuorumEpochResponseNodeEndpoint {
	var v BeginQuorumEpochResponseNodeEndpoint
	v.Default()
	return v
}

type BeginQuorumEpochResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	Topics []BeginQuorumEpochResponseTopic

	// Endpoints for all leaders enumerated in PartitionData.
	NodeEndpoints []BeginQuorumEpochResponseNodeEndpoint // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*BeginQuorumEpochResponse) Key() int16                 { return 53 }
func (*BeginQuorumEpochResponse) MaxVersion() int16          { return 1 }
func (v *BeginQuorumEpochResponse) SetVersion(version int16) { v.Version = version }
func (v *BeginQuorumEpochResponse) GetVersion() int16        { return v.Version }
func (v *BeginQuorumEpochResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *BeginQuorumEpochResponse) RequestKind() Request {
	return &BeginQuorumEpochRequest{Version: v.Version}
}

func (v *BeginQuorumEpochResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.NodeEndpoints) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.NodeEndpoints
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fNodeEndpoints:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						if version >= 1 {
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						if version >= 1 {
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						if version >= 1 {
							v := v.Port
							dst = kbin.AppendUint16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fNodeEndpoints
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BeginQuorumEpochResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BeginQuorumEpochResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BeginQuorumEpochResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]BeginQuorumEpochResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]BeginQuorumEpochResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.NodeEndpoints
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]BeginQuorumEpochResponseNodeEndpoint, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 1 {
						v := b.Int32()
						s.NodeID = v
					}
					if version >= 1 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					if version >= 1 {
						v := b.Uint16()
						s.Port = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.NodeEndpoints = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrBeginQuorumEpochResponse returns a pointer to a default BeginQuorumEpochResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBeginQuorumEpochResponse() *BeginQuorumEpochResponse {
	var v BeginQuorumEpochResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BeginQuorumEpochResponse.
func (v *BeginQuorumEpochResponse) Default() {
}

// NewBeginQuorumEpochResponse returns a default BeginQuorumEpochResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewBeginQuorumEpochResponse() BeginQuorumEpochResponse {
	var v BeginQuorumEpochResponse
	v.Default()
	return v
}

type EndQuorumEpochRequestTopicPartitionPreferredCandidate struct {
	CandidateID int32

	CandidateDirectoryID [16]byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochRequestTopicPartitionPreferredCandidate.
func (v *EndQuorumEpochRequestTopicPartitionPreferredCandidate) Default() {
}

// NewEndQuorumEpochRequestTopicPartitionPreferredCandidate returns a default EndQuorumEpochRequestTopicPartitionPreferredCandidate
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochRequestTopicPartitionPreferredCandidate() EndQuorumEpochRequestTopicPartitionPreferredCandidate {
	var v EndQuorumEpochRequestTopicPartitionPreferredCandidate
	v.Default()
	return v
}

type EndQuorumEpochRequestTopicPartition struct {
	Partition int32

	// The current leader ID that is resigning.
	LeaderID int32

	// The current epoch.
	LeaderEpoch int32

	// A sorted list of preferred successors to start the election.
	PreferredSuccessors []int32

	// A sorted list of preferred candidates to start the election.
	PreferredCandidates []EndQuorumEpochRequestTopicPartitionPreferredCandidate // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochRequestTopicPartition.
func (v *EndQuorumEpochRequestTopicPartition) Default() {
}

// NewEndQuorumEpochRequestTopicPartition returns a default EndQuorumEpochRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochRequestTopicPartition() EndQuorumEpochRequestTopicPartition {
	var v EndQuorumEpochRequestTopicPartition
	v.Default()
	return v
}

type EndQuorumEpochRequestTopic struct {
	Topic string

	Partitions []EndQuorumEpochRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochRequestTopic.
func (v *EndQuorumEpochRequestTopic) Default() {
}

// NewEndQuorumEpochRequestTopic returns a default EndQuorumEpochRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochRequestTopic() EndQuorumEpochRequestTopic {
	var v EndQuorumEpochRequestTopic
	v.Default()
	return v
}

type EndQuorumEpochRequestLeaderEndpoint struct {
	Name string

	Host string

	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochRequestLeaderEndpoint.
func (v *EndQuorumEpochRequestLeaderEndpoint) Default() {
}

// NewEndQuorumEpochRequestLeaderEndpoint returns a default EndQuorumEpochRequestLeaderEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochRequestLeaderEndpoint() EndQuorumEpochRequestLeaderEndpoint {
	var v EndQuorumEpochRequestLeaderEndpoint
	v.Default()
	return v
}

// Part of KIP-595 to replace Kafka's dependence on Zookeeper with a
// Kafka-only raft protocol,
// EndQuorumEpochRequest is sent by a leader to gracefully step down as leader
// (i.e. on shutdown). Stepping down begins a new election.
//
// Since this is relatively Kafka internal, most fields are left undocumented.
type EndQuorumEpochRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ClusterID *string

	Topics []EndQuorumEpochRequestTopic

	// Endpoints for the leader.
	LeaderEndpoints []EndQuorumEpochRequestLeaderEndpoint // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*EndQuorumEpochRequest) Key() int16                 { return 54 }
func (*EndQuorumEpochRequest) MaxVersion() int16          { return 1 }
func (v *EndQuorumEpochRequest) SetVersion(version int16) { v.Version = version }
func (v *EndQuorumEpochRequest) GetVersion() int16        { return v.Version }
func (v *EndQuorumEpochRequest) IsFlexible() bool         { return v.Version >= 1 }
func (v *EndQuorumEpochRequest) IsAdminRequest()          {}
func (v *EndQuorumEpochRequest) ResponseKind() Response {
	r := &EndQuorumEpochResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *EndQuorumEpochRequest) RequestWith(ctx context.Context, r Requestor) (*EndQuorumEpochResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*EndQuorumEpochResponse)
	return resp, err
}

func (v *EndQuorumEpochRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 0 && version <= 0 {
						v := v.PreferredSuccessors
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 1 {
						v := v.PreferredCandidates
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.CandidateID
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.CandidateDirectoryID
								dst = kbin.AppendUuid(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.LeaderEndpoints
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EndQuorumEpochRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EndQuorumEpochRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EndQuorumEpochRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]EndQuorumEpochRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]EndQuorumEpochRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if version >= 0 && version <= 0 {
						v := s.PreferredSuccessors
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.PreferredSuccessors = v
					}
					if version >= 1 {
						v := s.PreferredCandidates
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]EndQuorumEpochRequestTopicPartitionPreferredCandidate, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.CandidateID = v
							}
							{
								v := b.Uuid()
								s.CandidateDirectoryID = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.PreferredCandidates = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 1 {
		v := s.LeaderEndpoints
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]EndQuorumEpochRequestLeaderEndpoint, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.LeaderEndpoints = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrEndQuorumEpochRequest returns a pointer to a default EndQuorumEpochRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEndQuorumEpochRequest() *EndQuorumEpochRequest {
	var v EndQuorumEpochRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochRequest.
func (v *EndQuorumEpochRequest) Default() {
}

// NewEndQuorumEpochRequest returns a default EndQuorumEpochRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochRequest() EndQuorumEpochRequest {
	var v EndQuorumEpochRequest
	v.Default()
	return v
}

type EndQuorumEpochResponseTopicPartition struct {
	Partition int32

	ErrorCode int16

	// The ID of the current leader, or -1 if the leader is unknown.
	LeaderID int32

	// The latest known leader epoch.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochResponseTopicPartition.
func (v *EndQuorumEpochResponseTopicPartition) Default() {
}

// NewEndQuorumEpochResponseTopicPartition returns a default EndQuorumEpochResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochResponseTopicPartition() EndQuorumEpochResponseTopicPartition {
	var v EndQuorumEpochResponseTopicPartition
	v.Default()
	return v
}

type EndQuorumEpochResponseTopic struct {
	Topic string

	Partitions []EndQuorumEpochResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochResponseTopic.
func (v *EndQuorumEpochResponseTopic) Default() {
}

// NewEndQuorumEpochResponseTopic returns a default EndQuorumEpochResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochResponseTopic() EndQuorumEpochResponseTopic {
	var v EndQuorumEpochResponseTopic
	v.Default()
	return v
}

type EndQuorumEpochResponseNodeEndpoint struct {
	NodeID int32 // v1+

	Host string // v1+

	Port uint16 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochResponseNodeEndpoint.
func (v *EndQuorumEpochResponseNodeEndpoint) Default() {
}

// NewEndQuorumEpochResponseNodeEndpoint returns a default EndQuorumEpochResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochResponseNodeEndpoint() EndQuorumEpochResponseNodeEndpoint {
	var v EndQuorumEpochResponseNodeEndpoint
	v.Default()
	return v
}

type EndQuorumEpochResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	Topics []EndQuorumEpochResponseTopic

	// Endpoints for all leaders enumerated in PartitionData.
	NodeEndpoints []EndQuorumEpochResponseNodeEndpoint // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags // v1+
}

func (*EndQuorumEpochResponse) Key() int16                 { return 54 }
func (*EndQuorumEpochResponse) MaxVersion() int16          { return 1 }
func (v *EndQuorumEpochResponse) SetVersion(version int16) { v.Version = version }
func (v *EndQuorumEpochResponse) GetVersion() int16        { return v.Version }
func (v *EndQuorumEpochResponse) IsFlexible() bool         { return v.Version >= 1 }
func (v *EndQuorumEpochResponse) RequestKind() Request {
	return &EndQuorumEpochRequest{Version: v.Version}
}

func (v *EndQuorumEpochResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.NodeEndpoints) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.NodeEndpoints
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fNodeEndpoints:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						if version >= 1 {
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						if version >= 1 {
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						if version >= 1 {
							v := v.Port
							dst = kbin.AppendUint16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fNodeEndpoints
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EndQuorumEpochResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EndQuorumEpochResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EndQuorumEpochResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 1
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]EndQuorumEpochResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]EndQuorumEpochResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.NodeEndpoints
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]EndQuorumEpochResponseNodeEndpoint, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 1 {
						v := b.Int32()
						s.NodeID = v
					}
					if version >= 1 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					if version >= 1 {
						v := b.Uint16()
						s.Port = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.NodeEndpoints = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrEndQuorumEpochResponse returns a pointer to a default EndQuorumEpochResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEndQuorumEpochResponse() *EndQuorumEpochResponse {
	var v EndQuorumEpochResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EndQuorumEpochResponse.
func (v *EndQuorumEpochResponse) Default() {
}

// NewEndQuorumEpochResponse returns a default EndQuorumEpochResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndQuorumEpochResponse() EndQuorumEpochResponse {
	var v EndQuorumEpochResponse
	v.Default()
	return v
}

// A common struct used in DescribeQuorumResponse.
type DescribeQuorumResponseTopicPartitionReplicaState struct {
	ReplicaID int32

	ReplicaDirectoryID [16]byte // v2+

	// The last known log end offset of the follower, or -1 if it is unknown.
	LogEndOffset int64

	// The last known leader wall clock time when a follower fetched from the
	// leader, or -1 for the current leader or if unknown for a voter.
	//
	// This field has a default of -1.
	LastFetchTimestamp int64 // v1+

	// The leader wall clock append time of the offset for which the follower
	// made the most recent fetch request, or -1 for the current leader or if
	// unknown for a voter.
	//
	// This field has a default of -1.
	LastCaughtUpTimestamp int64 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponseTopicPartitionReplicaState.
func (v *DescribeQuorumResponseTopicPartitionReplicaState) Default() {
	v.LastFetchTimestamp = -1
	v.LastCaughtUpTimestamp = -1
}

// NewDescribeQuorumResponseTopicPartitionReplicaState returns a default DescribeQuorumResponseTopicPartitionReplicaState
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponseTopicPartitionReplicaState() DescribeQuorumResponseTopicPartitionReplicaState {
	var v DescribeQuorumResponseTopicPartitionReplicaState
	v.Default()
	return v
}

type DescribeQuorumRequestTopicPartition struct {
	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumRequestTopicPartition.
func (v *DescribeQuorumRequestTopicPartition) Default() {
}

// NewDescribeQuorumRequestTopicPartition returns a default DescribeQuorumRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumRequestTopicPartition() DescribeQuorumRequestTopicPartition {
	var v DescribeQuorumRequestTopicPartition
	v.Default()
	return v
}

type DescribeQuorumRequestTopic struct {
	Topic string

	Partitions []DescribeQuorumRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumRequestTopic.
func (v *DescribeQuorumRequestTopic) Default() {
}

// NewDescribeQuorumRequestTopic returns a default DescribeQuorumRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumRequestTopic() DescribeQuorumRequestTopic {
	var v DescribeQuorumRequestTopic
	v.Default()
	return v
}

// Part of KIP-642 (and KIP-595) to replace Kafka's dependence on Zookeeper with a
// Kafka-only raft protocol,
// DescribeQuorumRequest is sent by a leader to describe the quorum.
type DescribeQuorumRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	Topics []DescribeQuorumRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeQuorumRequest) Key() int16                 { return 55 }
func (*DescribeQuorumRequest) MaxVersion() int16          { return 2 }
func (v *DescribeQuorumRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeQuorumRequest) GetVersion() int16        { return v.Version }
func (v *DescribeQuorumRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeQuorumRequest) IsAdminRequest()          {}
func (v *DescribeQuorumRequest) ResponseKind() Response {
	r := &DescribeQuorumResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeQuorumRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeQuorumResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeQuorumResponse)
	return resp, err
}

func (v *DescribeQuorumRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeQuorumRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeQuorumRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeQuorumRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeQuorumRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeQuorumRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeQuorumRequest returns a pointer to a default DescribeQuorumRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeQuorumRequest() *DescribeQuorumRequest {
	var v DescribeQuorumRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumRequest.
func (v *DescribeQuorumRequest) Default() {
}

// NewDescribeQuorumRequest returns a default DescribeQuorumRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumRequest() DescribeQuorumRequest {
	var v DescribeQuorumRequest
	v.Default()
	return v
}

type DescribeQuorumResponseTopicPartition struct {
	Partition int32

	ErrorCode int16

	ErrorMessage *string // v2+

	// The ID of the current leader, or -1 if the leader is unknown.
	LeaderID int32

	// The latest known leader epoch.
	LeaderEpoch int32

	HighWatermark int64

	CurrentVoters []DescribeQuorumResponseTopicPartitionReplicaState

	Observers []DescribeQuorumResponseTopicPartitionReplicaState

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponseTopicPartition.
func (v *DescribeQuorumResponseTopicPartition) Default() {
}

// NewDescribeQuorumResponseTopicPartition returns a default DescribeQuorumResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponseTopicPartition() DescribeQuorumResponseTopicPartition {
	var v DescribeQuorumResponseTopicPartition
	v.Default()
	return v
}

type DescribeQuorumResponseTopic struct {
	Topic string

	Partitions []DescribeQuorumResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponseTopic.
func (v *DescribeQuorumResponseTopic) Default() {
}

// NewDescribeQuorumResponseTopic returns a default DescribeQuorumResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponseTopic() DescribeQuorumResponseTopic {
	var v DescribeQuorumResponseTopic
	v.Default()
	return v
}

type DescribeQuorumResponseNodeListener struct {
	Name string

	Host string

	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponseNodeListener.
func (v *DescribeQuorumResponseNodeListener) Default() {
}

// NewDescribeQuorumResponseNodeListener returns a default DescribeQuorumResponseNodeListener
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponseNodeListener() DescribeQuorumResponseNodeListener {
	var v DescribeQuorumResponseNodeListener
	v.Default()
	return v
}

type DescribeQuorumResponseNode struct {
	NodeID int32

	Listeners []DescribeQuorumResponseNodeListener

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponseNode.
func (v *DescribeQuorumResponseNode) Default() {
}

// NewDescribeQuorumResponseNode returns a default DescribeQuorumResponseNode
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponseNode() DescribeQuorumResponseNode {
	var v DescribeQuorumResponseNode
	v.Default()
	return v
}

type DescribeQuorumResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	ErrorCode int16

	ErrorMessage *string // v2+

	Topics []DescribeQuorumResponseTopic

	Nodes []DescribeQuorumResponseNode // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeQuorumResponse) Key() int16                 { return 55 }
func (*DescribeQuorumResponse) MaxVersion() int16          { return 2 }
func (v *DescribeQuorumResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeQuorumResponse) GetVersion() int16        { return v.Version }
func (v *DescribeQuorumResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeQuorumResponse) RequestKind() Request {
	return &DescribeQuorumRequest{Version: v.Version}
}

func (v *DescribeQuorumResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if version >= 2 {
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					if version >= 2 {
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.HighWatermark
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.CurrentVoters
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.ReplicaID
								dst = kbin.AppendInt32(dst, v)
							}
							if version >= 2 {
								v := v.ReplicaDirectoryID
								dst = kbin.AppendUuid(dst, v)
							}
							{
								v := v.LogEndOffset
								dst = kbin.AppendInt64(dst, v)
							}
							if version >= 1 {
								v := v.LastFetchTimestamp
								dst = kbin.AppendInt64(dst, v)
							}
							if version >= 1 {
								v := v.LastCaughtUpTimestamp
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.Observers
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.ReplicaID
								dst = kbin.AppendInt32(dst, v)
							}
							if version >= 2 {
								v := v.ReplicaDirectoryID
								dst = kbin.AppendUuid(dst, v)
							}
							{
								v := v.LogEndOffset
								dst = kbin.AppendInt64(dst, v)
							}
							if version >= 1 {
								v := v.LastFetchTimestamp
								dst = kbin.AppendInt64(dst, v)
							}
							if version >= 1 {
								v := v.LastCaughtUpTimestamp
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 2 {
		v := v.Nodes
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Listeners
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Name
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Host
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Port
						dst = kbin.AppendUint16(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeQuorumResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeQuorumResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeQuorumResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if version >= 2 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeQuorumResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeQuorumResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					if version >= 2 {
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Int64()
						s.HighWatermark = v
					}
					{
						v := s.CurrentVoters
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeQuorumResponseTopicPartitionReplicaState, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.ReplicaID = v
							}
							if version >= 2 {
								v := b.Uuid()
								s.ReplicaDirectoryID = v
							}
							{
								v := b.Int64()
								s.LogEndOffset = v
							}
							if version >= 1 {
								v := b.Int64()
								s.LastFetchTimestamp = v
							}
							if version >= 1 {
								v := b.Int64()
								s.LastCaughtUpTimestamp = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.CurrentVoters = v
					}
					{
						v := s.Observers
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeQuorumResponseTopicPartitionReplicaState, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.ReplicaID = v
							}
							if version >= 2 {
								v := b.Uuid()
								s.ReplicaDirectoryID = v
							}
							{
								v := b.Int64()
								s.LogEndOffset = v
							}
							if version >= 1 {
								v := b.Int64()
								s.LastFetchTimestamp = v
							}
							if version >= 1 {
								v := b.Int64()
								s.LastCaughtUpTimestamp = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Observers = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if version >= 2 {
		v := s.Nodes
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeQuorumResponseNode, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				v := s.Listeners
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeQuorumResponseNodeListener, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Name = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					{
						v := b.Uint16()
						s.Port = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Listeners = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Nodes = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeQuorumResponse returns a pointer to a default DescribeQuorumResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeQuorumResponse() *DescribeQuorumResponse {
	var v DescribeQuorumResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeQuorumResponse.
func (v *DescribeQuorumResponse) Default() {
}

// NewDescribeQuorumResponse returns a default DescribeQuorumResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeQuorumResponse() DescribeQuorumResponse {
	var v DescribeQuorumResponse
	v.Default()
	return v
}

type AlterPartitionRequestTopicPartitionNewEpochISR struct {
	// The broker ID .
	BrokerID int32

	// The broker's epoch; -1 if the epoch check is not supported.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionRequestTopicPartitionNewEpochISR.
func (v *AlterPartitionRequestTopicPartitionNewEpochISR) Default() {
	v.BrokerEpoch = -1
}

// NewAlterPartitionRequestTopicPartitionNewEpochISR returns a default AlterPartitionRequestTopicPartitionNewEpochISR
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionRequestTopicPartitionNewEpochISR() AlterPartitionRequestTopicPartitionNewEpochISR {
	var v AlterPartitionRequestTopicPartitionNewEpochISR
	v.Default()
	return v
}

type AlterPartitionRequestTopicPartition struct {
	Partition int32

	// The leader epoch of this partition.
	LeaderEpoch int32

	// The ISR for this partition.
	NewISR []int32 // v0-v2

	NewEpochISR []AlterPartitionRequestTopicPartitionNewEpochISR // v3+

	// 1 if the partition is recovering from unclean leader election; 0 otherwise
	LeaderRecoveryState int8 // v1+

	// The expected epoch of the partition which is being updated.
	// For a legacy cluster, this is the ZkVersion in the LeaderAndISR request.
	PartitionEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionRequestTopicPartition.
func (v *AlterPartitionRequestTopicPartition) Default() {
}

// NewAlterPartitionRequestTopicPartition returns a default AlterPartitionRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionRequestTopicPartition() AlterPartitionRequestTopicPartition {
	var v AlterPartitionRequestTopicPartition
	v.Default()
	return v
}

type AlterPartitionRequestTopic struct {
	Topic string // v0-v1

	TopicID [16]byte // v2+

	Partitions []AlterPartitionRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionRequestTopic.
func (v *AlterPartitionRequestTopic) Default() {
}

// NewAlterPartitionRequestTopic returns a default AlterPartitionRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionRequestTopic() AlterPartitionRequestTopic {
	var v AlterPartitionRequestTopic
	v.Default()
	return v
}

// AlterPartitionRequest, proposed in KIP-497 and introduced in Kafka 2.7.0,
// is an admin request to modify ISR.
//
// Version 3 was added for KIP-903 and replaced NewISR.
type AlterPartitionRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The ID of the requesting broker.
	BrokerID int32

	// The epoch of the requesting broker.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	Topics []AlterPartitionRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterPartitionRequest) Key() int16                 { return 56 }
func (*AlterPartitionRequest) MaxVersion() int16          { return 3 }
func (v *AlterPartitionRequest) SetVersion(version int16) { v.Version = version }
func (v *AlterPartitionRequest) GetVersion() int16        { return v.Version }
func (v *AlterPartitionRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterPartitionRequest) IsAdminRequest()          {}
func (v *AlterPartitionRequest) ResponseKind() Response {
	r := &AlterPartitionResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterPartitionRequest) RequestWith(ctx context.Context, r Requestor) (*AlterPartitionResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterPartitionResponse)
	return resp, err
}

func (v *AlterPartitionRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 1 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 2 {
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 0 && version <= 2 {
						v := v.NewISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 3 {
						v := v.NewEpochISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.BrokerID
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.BrokerEpoch
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if version >= 1 {
						v := v.LeaderRecoveryState
						dst = kbin.AppendInt8(dst, v)
					}
					{
						v := v.PartitionEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterPartitionRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterPartitionRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterPartitionRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	{
		v := b.Int64()
		s.BrokerEpoch = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterPartitionRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 1 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 2 {
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterPartitionRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if version >= 0 && version <= 2 {
						v := s.NewISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.NewISR = v
					}
					if version >= 3 {
						v := s.NewEpochISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]AlterPartitionRequestTopicPartitionNewEpochISR, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.BrokerID = v
							}
							{
								v := b.Int64()
								s.BrokerEpoch = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.NewEpochISR = v
					}
					if version >= 1 {
						v := b.Int8()
						s.LeaderRecoveryState = v
					}
					{
						v := b.Int32()
						s.PartitionEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterPartitionRequest returns a pointer to a default AlterPartitionRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterPartitionRequest() *AlterPartitionRequest {
	var v AlterPartitionRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionRequest.
func (v *AlterPartitionRequest) Default() {
	v.BrokerEpoch = -1
}

// NewAlterPartitionRequest returns a default AlterPartitionRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionRequest() AlterPartitionRequest {
	var v AlterPartitionRequest
	v.Default()
	return v
}

type AlterPartitionResponseTopicPartition struct {
	Partition int32

	ErrorCode int16

	// The broker ID of the leader.
	LeaderID int32

	// The leader epoch of this partition.
	LeaderEpoch int32

	// The in-sync replica ids.
	ISR []int32

	// 1 if the partition is recovering from unclean leader election; 0 otherwise
	LeaderRecoveryState int8 // v1+

	// The current epoch of the partition for KRaft controllers.
	// The current ZK version for legacy controllers.
	PartitionEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionResponseTopicPartition.
func (v *AlterPartitionResponseTopicPartition) Default() {
}

// NewAlterPartitionResponseTopicPartition returns a default AlterPartitionResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionResponseTopicPartition() AlterPartitionResponseTopicPartition {
	var v AlterPartitionResponseTopicPartition
	v.Default()
	return v
}

type AlterPartitionResponseTopic struct {
	Topic string // v0-v1

	TopidID [16]byte // v2+

	Partitions []AlterPartitionResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionResponseTopic.
func (v *AlterPartitionResponseTopic) Default() {
}

// NewAlterPartitionResponseTopic returns a default AlterPartitionResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionResponseTopic() AlterPartitionResponseTopic {
	var v AlterPartitionResponseTopic
	v.Default()
	return v
}

type AlterPartitionResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	Topics []AlterPartitionResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterPartitionResponse) Key() int16                         { return 56 }
func (*AlterPartitionResponse) MaxVersion() int16                  { return 3 }
func (v *AlterPartitionResponse) SetVersion(version int16)         { v.Version = version }
func (v *AlterPartitionResponse) GetVersion() int16                { return v.Version }
func (v *AlterPartitionResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *AlterPartitionResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *AlterPartitionResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *AlterPartitionResponse) RequestKind() Request {
	return &AlterPartitionRequest{Version: v.Version}
}

func (v *AlterPartitionResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			if version >= 0 && version <= 1 {
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 2 {
				v := v.TopidID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if version >= 1 {
						v := v.LeaderRecoveryState
						dst = kbin.AppendInt8(dst, v)
					}
					{
						v := v.PartitionEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterPartitionResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterPartitionResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterPartitionResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterPartitionResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			if version >= 0 && version <= 1 {
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if version >= 2 {
				v := b.Uuid()
				s.TopidID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterPartitionResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := s.ISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.ISR = v
					}
					if version >= 1 {
						v := b.Int8()
						s.LeaderRecoveryState = v
					}
					{
						v := b.Int32()
						s.PartitionEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterPartitionResponse returns a pointer to a default AlterPartitionResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterPartitionResponse() *AlterPartitionResponse {
	var v AlterPartitionResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterPartitionResponse.
func (v *AlterPartitionResponse) Default() {
}

// NewAlterPartitionResponse returns a default AlterPartitionResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterPartitionResponse() AlterPartitionResponse {
	var v AlterPartitionResponse
	v.Default()
	return v
}

type UpdateFeaturesRequestFeatureUpdate struct {
	// The name of the finalized feature to update.
	Feature string

	// The new maximum version level for the finalized feature. A value >= 1 is
	// valid. A value < 1, is special, and can be used to request the deletion
	// of the finalized feature.
	MaxVersionLevel int16

	// When set to true, the finalized feature version level is allowed to be
	// downgraded/deleted. The downgrade request will fail if the new maximum
	// version level is a value that's not lower than the existing maximum
	// finalized version level.
	//
	// Replaced in v1 with ValidateOnly.
	AllowDowngrade bool

	// Determine which type of upgrade will be performed: 1 will perform an
	// upgrade only (default), 2 is safe downgrades only (lossless), 3 is
	// unsafe downgrades (lossy).
	UpgradeType int8 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateFeaturesRequestFeatureUpdate.
func (v *UpdateFeaturesRequestFeatureUpdate) Default() {
}

// NewUpdateFeaturesRequestFeatureUpdate returns a default UpdateFeaturesRequestFeatureUpdate
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateFeaturesRequestFeatureUpdate() UpdateFeaturesRequestFeatureUpdate {
	var v UpdateFeaturesRequestFeatureUpdate
	v.Default()
	return v
}

// From KIP-584 and introduced in 2.7.0, this request updates broker-wide features.
type UpdateFeaturesRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 60000.
	TimeoutMillis int32

	// The list of updates to finalized features.
	FeatureUpdates []UpdateFeaturesRequestFeatureUpdate

	// True if we should validate the request, but not perform the upgrade or
	// downgrade.
	ValidateOnly bool // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UpdateFeaturesRequest) Key() int16                       { return 57 }
func (*UpdateFeaturesRequest) MaxVersion() int16                { return 2 }
func (v *UpdateFeaturesRequest) SetVersion(version int16)       { v.Version = version }
func (v *UpdateFeaturesRequest) GetVersion() int16              { return v.Version }
func (v *UpdateFeaturesRequest) IsFlexible() bool               { return v.Version >= 0 }
func (v *UpdateFeaturesRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *UpdateFeaturesRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *UpdateFeaturesRequest) IsAdminRequest()                {}
func (v *UpdateFeaturesRequest) ResponseKind() Response {
	r := &UpdateFeaturesResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *UpdateFeaturesRequest) RequestWith(ctx context.Context, r Requestor) (*UpdateFeaturesResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*UpdateFeaturesResponse)
	return resp, err
}

func (v *UpdateFeaturesRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.FeatureUpdates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Feature
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.MaxVersionLevel
				dst = kbin.AppendInt16(dst, v)
			}
			if version >= 0 && version <= 0 {
				v := v.AllowDowngrade
				dst = kbin.AppendBool(dst, v)
			}
			if version >= 1 {
				v := v.UpgradeType
				dst = kbin.AppendInt8(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.ValidateOnly
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateFeaturesRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateFeaturesRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateFeaturesRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		v := s.FeatureUpdates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateFeaturesRequestFeatureUpdate, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Feature = v
			}
			{
				v := b.Int16()
				s.MaxVersionLevel = v
			}
			if version >= 0 && version <= 0 {
				v := b.Bool()
				s.AllowDowngrade = v
			}
			if version >= 1 {
				v := b.Int8()
				s.UpgradeType = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.FeatureUpdates = v
	}
	if version >= 1 {
		v := b.Bool()
		s.ValidateOnly = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUpdateFeaturesRequest returns a pointer to a default UpdateFeaturesRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateFeaturesRequest() *UpdateFeaturesRequest {
	var v UpdateFeaturesRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateFeaturesRequest.
func (v *UpdateFeaturesRequest) Default() {
	v.TimeoutMillis = 60000
}

// NewUpdateFeaturesRequest returns a default UpdateFeaturesRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateFeaturesRequest() UpdateFeaturesRequest {
	var v UpdateFeaturesRequest
	v.Default()
	return v
}

type UpdateFeaturesResponseResult struct {
	// The name of the finalized feature.
	Feature string

	// The feature update error code, if any.
	ErrorCode int16

	// The feature update error, if any.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateFeaturesResponseResult.
func (v *UpdateFeaturesResponseResult) Default() {
}

// NewUpdateFeaturesResponseResult returns a default UpdateFeaturesResponseResult
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateFeaturesResponseResult() UpdateFeaturesResponseResult {
	var v UpdateFeaturesResponseResult
	v.Default()
	return v
}

type UpdateFeaturesResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The top level error code, if any.
	ErrorCode int16

	// An informative message if the request errored, if any.
	ErrorMessage *string

	// The results for each feature update request.
	Results []UpdateFeaturesResponseResult // v0-v1

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UpdateFeaturesResponse) Key() int16                         { return 57 }
func (*UpdateFeaturesResponse) MaxVersion() int16                  { return 2 }
func (v *UpdateFeaturesResponse) SetVersion(version int16)         { v.Version = version }
func (v *UpdateFeaturesResponse) GetVersion() int16                { return v.Version }
func (v *UpdateFeaturesResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *UpdateFeaturesResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *UpdateFeaturesResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *UpdateFeaturesResponse) RequestKind() Request {
	return &UpdateFeaturesRequest{Version: v.Version}
}

func (v *UpdateFeaturesResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 0 && version <= 1 {
		v := v.Results
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Feature
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateFeaturesResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateFeaturesResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateFeaturesResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if version >= 0 && version <= 1 {
		v := s.Results
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateFeaturesResponseResult, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Feature = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Results = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUpdateFeaturesResponse returns a pointer to a default UpdateFeaturesResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateFeaturesResponse() *UpdateFeaturesResponse {
	var v UpdateFeaturesResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateFeaturesResponse.
func (v *UpdateFeaturesResponse) Default() {
}

// NewUpdateFeaturesResponse returns a default UpdateFeaturesResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateFeaturesResponse() UpdateFeaturesResponse {
	var v UpdateFeaturesResponse
	v.Default()
	return v
}

// Introduced for KIP-590, EnvelopeRequest is what brokers use to wrap an
// incoming request before forwarding it to another broker.
type EnvelopeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The embedded request header and data.
	RequestData []byte

	// Value of the initial client principal when the request is redirected by a broker.
	RequestPrincipal []byte

	// The original client's address in bytes.
	ClientHostAddress []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*EnvelopeRequest) Key() int16                 { return 58 }
func (*EnvelopeRequest) MaxVersion() int16          { return 0 }
func (v *EnvelopeRequest) SetVersion(version int16) { v.Version = version }
func (v *EnvelopeRequest) GetVersion() int16        { return v.Version }
func (v *EnvelopeRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *EnvelopeRequest) IsAdminRequest()          {}
func (v *EnvelopeRequest) ResponseKind() Response {
	r := &EnvelopeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *EnvelopeRequest) RequestWith(ctx context.Context, r Requestor) (*EnvelopeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*EnvelopeResponse)
	return resp, err
}

func (v *EnvelopeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.RequestData
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	{
		v := v.RequestPrincipal
		if isFlexible {
			dst = kbin.AppendCompactNullableBytes(dst, v)
		} else {
			dst = kbin.AppendNullableBytes(dst, v)
		}
	}
	{
		v := v.ClientHostAddress
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EnvelopeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EnvelopeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EnvelopeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.RequestData = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactNullableBytes()
		} else {
			v = b.NullableBytes()
		}
		s.RequestPrincipal = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.ClientHostAddress = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrEnvelopeRequest returns a pointer to a default EnvelopeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEnvelopeRequest() *EnvelopeRequest {
	var v EnvelopeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EnvelopeRequest.
func (v *EnvelopeRequest) Default() {
}

// NewEnvelopeRequest returns a default EnvelopeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewEnvelopeRequest() EnvelopeRequest {
	var v EnvelopeRequest
	v.Default()
	return v
}

type EnvelopeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The embedded response header and data.
	ResponseData []byte

	// The error code, or 0 if there was no error.
	//
	// NOT_CONTROLLER is returned when the request is not sent to the controller.
	//
	// CLUSTER_AUTHORIZATION_FAILED is returned if inter-broker authorization failed.
	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*EnvelopeResponse) Key() int16                 { return 58 }
func (*EnvelopeResponse) MaxVersion() int16          { return 0 }
func (v *EnvelopeResponse) SetVersion(version int16) { v.Version = version }
func (v *EnvelopeResponse) GetVersion() int16        { return v.Version }
func (v *EnvelopeResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *EnvelopeResponse) RequestKind() Request     { return &EnvelopeRequest{Version: v.Version} }

func (v *EnvelopeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ResponseData
		if isFlexible {
			dst = kbin.AppendCompactNullableBytes(dst, v)
		} else {
			dst = kbin.AppendNullableBytes(dst, v)
		}
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *EnvelopeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *EnvelopeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *EnvelopeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v []byte
		if isFlexible {
			v = b.CompactNullableBytes()
		} else {
			v = b.NullableBytes()
		}
		s.ResponseData = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrEnvelopeResponse returns a pointer to a default EnvelopeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrEnvelopeResponse() *EnvelopeResponse {
	var v EnvelopeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to EnvelopeResponse.
func (v *EnvelopeResponse) Default() {
}

// NewEnvelopeResponse returns a default EnvelopeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewEnvelopeResponse() EnvelopeResponse {
	var v EnvelopeResponse
	v.Default()
	return v
}

type FetchSnapshotRequestTopicPartitionSnapshotID struct {
	EndOffset int64

	Epoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotRequestTopicPartitionSnapshotID.
func (v *FetchSnapshotRequestTopicPartitionSnapshotID) Default() {
}

// NewFetchSnapshotRequestTopicPartitionSnapshotID returns a default FetchSnapshotRequestTopicPartitionSnapshotID
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotRequestTopicPartitionSnapshotID() FetchSnapshotRequestTopicPartitionSnapshotID {
	var v FetchSnapshotRequestTopicPartitionSnapshotID
	v.Default()
	return v
}

type FetchSnapshotRequestTopicPartition struct {
	// The partition to fetch.
	Partition int32

	// The current leader epoch of the partition, or -1 for an unknown leader epoch.
	CurrentLeaderEpoch int32

	// The snapshot end offset and epoch to fetch.
	SnapshotID FetchSnapshotRequestTopicPartitionSnapshotID

	// The byte position within the snapshot to start fetching from.
	Position int64

	// The directory id of the follower fetching.
	ReplicaDirectoryID [16]byte // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotRequestTopicPartition.
func (v *FetchSnapshotRequestTopicPartition) Default() {
	{
		v := &v.SnapshotID
		_ = v
	}
}

// NewFetchSnapshotRequestTopicPartition returns a default FetchSnapshotRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotRequestTopicPartition() FetchSnapshotRequestTopicPartition {
	var v FetchSnapshotRequestTopicPartition
	v.Default()
	return v
}

type FetchSnapshotRequestTopic struct {
	// The name of the topic to fetch.
	Topic string

	// The partitions to fetch.
	Partitions []FetchSnapshotRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotRequestTopic.
func (v *FetchSnapshotRequestTopic) Default() {
}

// NewFetchSnapshotRequestTopic returns a default FetchSnapshotRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotRequestTopic() FetchSnapshotRequestTopic {
	var v FetchSnapshotRequestTopic
	v.Default()
	return v
}

// Introduced for KIP-630, FetchSnapshotRequest is a part of the inter-Kafka
// raft protocol to remove the dependency on Zookeeper.
type FetchSnapshotRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The ClusterID if known, this is used to validate metadata fetches prior to
	// broker registration.
	ClusterID *string // tag 0

	// The broker ID of the follower.
	//
	// This field has a default of -1.
	ReplicaID int32

	// The maximum bytes to fetch from all of the snapshots.
	//
	// This field has a default of 0x7fffffff.
	MaxBytes int32

	// The topics to fetch.
	Topics []FetchSnapshotRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*FetchSnapshotRequest) Key() int16                 { return 59 }
func (*FetchSnapshotRequest) MaxVersion() int16          { return 1 }
func (v *FetchSnapshotRequest) SetVersion(version int16) { v.Version = version }
func (v *FetchSnapshotRequest) GetVersion() int16        { return v.Version }
func (v *FetchSnapshotRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *FetchSnapshotRequest) ResponseKind() Response {
	r := &FetchSnapshotResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *FetchSnapshotRequest) RequestWith(ctx context.Context, r Requestor) (*FetchSnapshotResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*FetchSnapshotResponse)
	return resp, err
}

func (v *FetchSnapshotRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ReplicaID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MaxBytes
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.CurrentLeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := &v.SnapshotID
						{
							v := v.EndOffset
							dst = kbin.AppendInt64(dst, v)
						}
						{
							v := v.Epoch
							dst = kbin.AppendInt32(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := v.Position
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						var toEncode []uint32
						if v.ReplicaDirectoryID != [16]byte{} {
							toEncode = append(toEncode, 0)
						}
						dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
						for _, tag := range toEncode {
							switch tag {
							case 0:
								{
									v := v.ReplicaDirectoryID
									dst = kbin.AppendUvarint(dst, 0)
									dst = kbin.AppendUvarint(dst, 16)
									dst = kbin.AppendUuid(dst, v)
								}
							}
						}
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if v.ClusterID != nil {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.ClusterID
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fClusterID:
					if isFlexible {
						dst = kbin.AppendCompactNullableString(dst, v)
					} else {
						dst = kbin.AppendNullableString(dst, v)
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fClusterID
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FetchSnapshotRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FetchSnapshotRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FetchSnapshotRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ReplicaID = v
	}
	{
		v := b.Int32()
		s.MaxBytes = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FetchSnapshotRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchSnapshotRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.CurrentLeaderEpoch = v
					}
					{
						v := &s.SnapshotID
						v.Default()
						s := v
						{
							v := b.Int64()
							s.EndOffset = v
						}
						{
							v := b.Int32()
							s.Epoch = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						v := b.Int64()
						s.Position = v
					}
					if isFlexible {
						for i := b.Uvarint(); i > 0; i-- {
							switch key := b.Uvarint(); key {
							default:
								s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
							case 0:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := b.Uuid()
								s.ReplicaDirectoryID = v
								if err := b.Complete(); err != nil {
									return err
								}
							}
						}
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ClusterID = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrFetchSnapshotRequest returns a pointer to a default FetchSnapshotRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFetchSnapshotRequest() *FetchSnapshotRequest {
	var v FetchSnapshotRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotRequest.
func (v *FetchSnapshotRequest) Default() {
	v.ReplicaID = -1
	v.MaxBytes = 2147483647
}

// NewFetchSnapshotRequest returns a default FetchSnapshotRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotRequest() FetchSnapshotRequest {
	var v FetchSnapshotRequest
	v.Default()
	return v
}

type FetchSnapshotResponseTopicPartitionSnapshotID struct {
	EndOffset int64

	Epoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponseTopicPartitionSnapshotID.
func (v *FetchSnapshotResponseTopicPartitionSnapshotID) Default() {
}

// NewFetchSnapshotResponseTopicPartitionSnapshotID returns a default FetchSnapshotResponseTopicPartitionSnapshotID
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponseTopicPartitionSnapshotID() FetchSnapshotResponseTopicPartitionSnapshotID {
	var v FetchSnapshotResponseTopicPartitionSnapshotID
	v.Default()
	return v
}

type FetchSnapshotResponseTopicPartitionCurrentLeader struct {
	LeaderID int32

	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponseTopicPartitionCurrentLeader.
func (v *FetchSnapshotResponseTopicPartitionCurrentLeader) Default() {
}

// NewFetchSnapshotResponseTopicPartitionCurrentLeader returns a default FetchSnapshotResponseTopicPartitionCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponseTopicPartitionCurrentLeader() FetchSnapshotResponseTopicPartitionCurrentLeader {
	var v FetchSnapshotResponseTopicPartitionCurrentLeader
	v.Default()
	return v
}

type FetchSnapshotResponseTopicPartition struct {
	// The partition.
	Partition int32

	// An error code, or 0 if there was no fetch error.
	ErrorCode int16

	// The snapshot end offset and epoch to fetch.
	SnapshotID FetchSnapshotResponseTopicPartitionSnapshotID

	// The ID of the current leader (or -1 if unknown) and the latest known
	// leader epoch.
	CurrentLeader FetchSnapshotResponseTopicPartitionCurrentLeader // tag 0

	// The total size of the snapshot.
	Size int64

	// The starting byte position within the snapshot included in the Bytes
	// field.
	Position int64

	// Snapshot data.
	Bytes []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponseTopicPartition.
func (v *FetchSnapshotResponseTopicPartition) Default() {
	{
		v := &v.SnapshotID
		_ = v
	}
	{
		v := &v.CurrentLeader
		_ = v
	}
}

// NewFetchSnapshotResponseTopicPartition returns a default FetchSnapshotResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponseTopicPartition() FetchSnapshotResponseTopicPartition {
	var v FetchSnapshotResponseTopicPartition
	v.Default()
	return v
}

type FetchSnapshotResponseTopic struct {
	// The name of the topic to fetch.
	Topic string

	// The partitions to fetch.
	Partitions []FetchSnapshotResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponseTopic.
func (v *FetchSnapshotResponseTopic) Default() {
}

// NewFetchSnapshotResponseTopic returns a default FetchSnapshotResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponseTopic() FetchSnapshotResponseTopic {
	var v FetchSnapshotResponseTopic
	v.Default()
	return v
}

type FetchSnapshotResponseNodeEndpoint struct {
	NodeID int32 // v1+

	Host string // v1+

	Port uint16 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponseNodeEndpoint.
func (v *FetchSnapshotResponseNodeEndpoint) Default() {
}

// NewFetchSnapshotResponseNodeEndpoint returns a default FetchSnapshotResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponseNodeEndpoint() FetchSnapshotResponseNodeEndpoint {
	var v FetchSnapshotResponseNodeEndpoint
	v.Default()
	return v
}

// FetchSnapshotResponse is a response for a FetchSnapshotRequest.
type FetchSnapshotResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The top level response error code.
	ErrorCode int16

	// The topics to fetch.
	Topics []FetchSnapshotResponseTopic

	// Endpoints for all leaders enumerated in PartitionData.
	NodeEndpoints []FetchSnapshotResponseNodeEndpoint // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*FetchSnapshotResponse) Key() int16                         { return 59 }
func (*FetchSnapshotResponse) MaxVersion() int16                  { return 1 }
func (v *FetchSnapshotResponse) SetVersion(version int16)         { v.Version = version }
func (v *FetchSnapshotResponse) GetVersion() int16                { return v.Version }
func (v *FetchSnapshotResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *FetchSnapshotResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *FetchSnapshotResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *FetchSnapshotResponse) RequestKind() Request {
	return &FetchSnapshotRequest{Version: v.Version}
}

func (v *FetchSnapshotResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := &v.SnapshotID
						{
							v := v.EndOffset
							dst = kbin.AppendInt64(dst, v)
						}
						{
							v := v.Epoch
							dst = kbin.AppendInt32(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := v.Size
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.Position
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.Bytes
						if isFlexible {
							dst = kbin.AppendCompactBytes(dst, v)
						} else {
							dst = kbin.AppendBytes(dst, v)
						}
					}
					if isFlexible {
						var toEncode []uint32
						if !reflect.DeepEqual(v.CurrentLeader, (func() FetchSnapshotResponseTopicPartitionCurrentLeader {
							var v FetchSnapshotResponseTopicPartitionCurrentLeader
							v.Default()
							return v
						})()) {
							toEncode = append(toEncode, 0)
						}
						dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
						for _, tag := range toEncode {
							switch tag {
							case 0:
								{
									v := v.CurrentLeader
									dst = kbin.AppendUvarint(dst, 0)
									sized := false
									lenAt := len(dst)
								fCurrentLeader:
									{
										v := v.LeaderID
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.LeaderEpoch
										dst = kbin.AppendInt32(dst, v)
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
									if !sized {
										dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
										sized = true
										goto fCurrentLeader
									}
								}
							}
						}
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.NodeEndpoints) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.NodeEndpoints
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fNodeEndpoints:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := &v[i]
						if version >= 1 {
							v := v.NodeID
							dst = kbin.AppendInt32(dst, v)
						}
						if version >= 1 {
							v := v.Host
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
						if version >= 1 {
							v := v.Port
							dst = kbin.AppendUint16(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fNodeEndpoints
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *FetchSnapshotResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *FetchSnapshotResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *FetchSnapshotResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]FetchSnapshotResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchSnapshotResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := &s.SnapshotID
						v.Default()
						s := v
						{
							v := b.Int64()
							s.EndOffset = v
						}
						{
							v := b.Int32()
							s.Epoch = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						v := b.Int64()
						s.Size = v
					}
					{
						v := b.Int64()
						s.Position = v
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactBytes()
						} else {
							v = b.Bytes()
						}
						s.Bytes = v
					}
					if isFlexible {
						for i := b.Uvarint(); i > 0; i-- {
							switch key := b.Uvarint(); key {
							default:
								s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
							case 0:
								b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
								v := &s.CurrentLeader
								v.Default()
								s := v
								{
									v := b.Int32()
									s.LeaderID = v
								}
								{
									v := b.Int32()
									s.LeaderEpoch = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
								if err := b.Complete(); err != nil {
									return err
								}
							}
						}
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.NodeEndpoints
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]FetchSnapshotResponseNodeEndpoint, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					if version >= 1 {
						v := b.Int32()
						s.NodeID = v
					}
					if version >= 1 {
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Host = v
					}
					if version >= 1 {
						v := b.Uint16()
						s.Port = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.NodeEndpoints = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrFetchSnapshotResponse returns a pointer to a default FetchSnapshotResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrFetchSnapshotResponse() *FetchSnapshotResponse {
	var v FetchSnapshotResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to FetchSnapshotResponse.
func (v *FetchSnapshotResponse) Default() {
}

// NewFetchSnapshotResponse returns a default FetchSnapshotResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewFetchSnapshotResponse() FetchSnapshotResponse {
	var v FetchSnapshotResponse
	v.Default()
	return v
}

// Introduced for KIP-700, DescribeClusterRequest is effectively an "admin"
// type metadata request for information that producers or consumers do not
// need to care about.
type DescribeClusterRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Whether to include cluster authorized operations. This requires DESCRIBE
	// on CLUSTER.
	IncludeClusterAuthorizedOperations bool

	// The endpoint type to describe. 1=brokers, 2=controllers.
	//
	// This field has a default of 1.
	EndpointType int8 // v1+

	// Whether to include fenced brokers when listing brokers.
	IncludeFencedBrokers bool // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeClusterRequest) Key() int16                 { return 60 }
func (*DescribeClusterRequest) MaxVersion() int16          { return 2 }
func (v *DescribeClusterRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeClusterRequest) GetVersion() int16        { return v.Version }
func (v *DescribeClusterRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeClusterRequest) ResponseKind() Response {
	r := &DescribeClusterResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeClusterRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeClusterResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeClusterResponse)
	return resp, err
}

func (v *DescribeClusterRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.IncludeClusterAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 1 {
		v := v.EndpointType
		dst = kbin.AppendInt8(dst, v)
	}
	if version >= 2 {
		v := v.IncludeFencedBrokers
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeClusterRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeClusterRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeClusterRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Bool()
		s.IncludeClusterAuthorizedOperations = v
	}
	if version >= 1 {
		v := b.Int8()
		s.EndpointType = v
	}
	if version >= 2 {
		v := b.Bool()
		s.IncludeFencedBrokers = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeClusterRequest returns a pointer to a default DescribeClusterRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeClusterRequest() *DescribeClusterRequest {
	var v DescribeClusterRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClusterRequest.
func (v *DescribeClusterRequest) Default() {
	v.EndpointType = 1
}

// NewDescribeClusterRequest returns a default DescribeClusterRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClusterRequest() DescribeClusterRequest {
	var v DescribeClusterRequest
	v.Default()
	return v
}

type DescribeClusterResponseBroker struct {
	// NodeID is the node ID of a Kafka broker.
	NodeID int32

	// Host is the hostname of a Kafka broker.
	Host string

	// Port is the port of a Kafka broker.
	Port int32

	// Rack is the rack this Kafka broker is in, if any.
	Rack *string

	// Whether the broker is fenced.
	IsFenced bool // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClusterResponseBroker.
func (v *DescribeClusterResponseBroker) Default() {
}

// NewDescribeClusterResponseBroker returns a default DescribeClusterResponseBroker
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClusterResponseBroker() DescribeClusterResponseBroker {
	var v DescribeClusterResponseBroker
	v.Default()
	return v
}

// DescribeClusterResponse is a response to a DescribeClusterRequest.
type DescribeClusterResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// The top level response error code.
	ErrorCode int16

	// The top level error message, if any.
	ErrorMessage *string

	// The endpoint type that was described. 1=brokers, 2=controllers.
	//
	// This field has a default of 1.
	EndpointType int8 // v1+

	// The cluster ID that responding broker belongs to.
	ClusterID string

	// The ID of the controller broker.
	//
	// This field has a default of -1.
	ControllerID int32

	// Brokers is a set of alive Kafka brokers (this mirrors MetadataResponse.Brokers).
	Brokers []DescribeClusterResponseBroker

	// 32-bit bitfield to represent authorized operations for this cluster.
	//
	// This field has a default of -2147483648.
	ClusterAuthorizedOperations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeClusterResponse) Key() int16                 { return 60 }
func (*DescribeClusterResponse) MaxVersion() int16          { return 2 }
func (v *DescribeClusterResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeClusterResponse) GetVersion() int16        { return v.Version }
func (v *DescribeClusterResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeClusterResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *DescribeClusterResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeClusterResponse) RequestKind() Request {
	return &DescribeClusterRequest{Version: v.Version}
}

func (v *DescribeClusterResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.EndpointType
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Brokers
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Rack
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if version >= 2 {
				v := v.IsFenced
				dst = kbin.AppendBool(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ClusterAuthorizedOperations
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeClusterResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeClusterResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeClusterResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if version >= 1 {
		v := b.Int8()
		s.EndpointType = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ClusterID = v
	}
	{
		v := b.Int32()
		s.ControllerID = v
	}
	{
		v := s.Brokers
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeClusterResponseBroker, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Rack = v
			}
			if version >= 2 {
				v := b.Bool()
				s.IsFenced = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Brokers = v
	}
	{
		v := b.Int32()
		s.ClusterAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeClusterResponse returns a pointer to a default DescribeClusterResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeClusterResponse() *DescribeClusterResponse {
	var v DescribeClusterResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeClusterResponse.
func (v *DescribeClusterResponse) Default() {
	v.EndpointType = 1
	v.ControllerID = -1
	v.ClusterAuthorizedOperations = -2147483648
}

// NewDescribeClusterResponse returns a default DescribeClusterResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeClusterResponse() DescribeClusterResponse {
	var v DescribeClusterResponse
	v.Default()
	return v
}

type DescribeProducersRequestTopic struct {
	Topic string

	// The partitions to list producers for for the given topic.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersRequestTopic.
func (v *DescribeProducersRequestTopic) Default() {
}

// NewDescribeProducersRequestTopic returns a default DescribeProducersRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersRequestTopic() DescribeProducersRequestTopic {
	var v DescribeProducersRequestTopic
	v.Default()
	return v
}

// Introduced for KIP-664, DescribeProducersRequest allows for introspecting
// the state of the transaction coordinator. This request can be used to detect
// hanging transactions or other EOS-related problems.
//
// This request allows for describing the state of the active
// idempotent/transactional producers.
type DescribeProducersRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The topics to describe producers for.
	Topics []DescribeProducersRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeProducersRequest) Key() int16                 { return 61 }
func (*DescribeProducersRequest) MaxVersion() int16          { return 0 }
func (v *DescribeProducersRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeProducersRequest) GetVersion() int16        { return v.Version }
func (v *DescribeProducersRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeProducersRequest) ResponseKind() Response {
	r := &DescribeProducersResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeProducersRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeProducersResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeProducersResponse)
	return resp, err
}

func (v *DescribeProducersRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeProducersRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeProducersRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeProducersRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeProducersRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeProducersRequest returns a pointer to a default DescribeProducersRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeProducersRequest() *DescribeProducersRequest {
	var v DescribeProducersRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersRequest.
func (v *DescribeProducersRequest) Default() {
}

// NewDescribeProducersRequest returns a default DescribeProducersRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersRequest() DescribeProducersRequest {
	var v DescribeProducersRequest
	v.Default()
	return v
}

type DescribeProducersResponseTopicPartitionActiveProducer struct {
	ProducerID int64

	ProducerEpoch int32

	// The last sequence produced.
	//
	// This field has a default of -1.
	LastSequence int32

	// The last timestamp produced.
	//
	// This field has a default of -1.
	LastTimestamp int64

	// The epoch of the transactional coordinator for this last produce.
	CoordinatorEpoch int32

	// The first offset of the transaction.
	//
	// This field has a default of -1.
	CurrentTxnStartOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersResponseTopicPartitionActiveProducer.
func (v *DescribeProducersResponseTopicPartitionActiveProducer) Default() {
	v.LastSequence = -1
	v.LastTimestamp = -1
	v.CurrentTxnStartOffset = -1
}

// NewDescribeProducersResponseTopicPartitionActiveProducer returns a default DescribeProducersResponseTopicPartitionActiveProducer
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersResponseTopicPartitionActiveProducer() DescribeProducersResponseTopicPartitionActiveProducer {
	var v DescribeProducersResponseTopicPartitionActiveProducer
	v.Default()
	return v
}

type DescribeProducersResponseTopicPartition struct {
	Partition int32

	// The partition error code, or 0 if there was no error.
	//
	// NOT_LEADER_OR_FOLLOWER is returned if the broker receiving this request
	// is not the leader of the partition.
	//
	// TOPIC_AUTHORIZATION_FAILED is returned if the user does not have Describe
	// permissions on the topic.
	//
	// UNKNOWN_TOPIC_OR_PARTITION is returned if the partition is not known to exist.
	//
	// Other errors may be returned corresponding to the partition being offline, etc.
	ErrorCode int16

	// The partition error message, which may be null if no additional details are available.
	ErrorMessage *string

	// The current idempotent or transactional producers producing to this partition,
	// and the metadata related to their produce requests.
	ActiveProducers []DescribeProducersResponseTopicPartitionActiveProducer

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersResponseTopicPartition.
func (v *DescribeProducersResponseTopicPartition) Default() {
}

// NewDescribeProducersResponseTopicPartition returns a default DescribeProducersResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersResponseTopicPartition() DescribeProducersResponseTopicPartition {
	var v DescribeProducersResponseTopicPartition
	v.Default()
	return v
}

type DescribeProducersResponseTopic struct {
	Topic string

	Partitions []DescribeProducersResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersResponseTopic.
func (v *DescribeProducersResponseTopic) Default() {
}

// NewDescribeProducersResponseTopic returns a default DescribeProducersResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersResponseTopic() DescribeProducersResponseTopic {
	var v DescribeProducersResponseTopic
	v.Default()
	return v
}

// DescribeProducersResponse is a response to a DescribeProducersRequest.
type DescribeProducersResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	Topics []DescribeProducersResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeProducersResponse) Key() int16                 { return 61 }
func (*DescribeProducersResponse) MaxVersion() int16          { return 0 }
func (v *DescribeProducersResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeProducersResponse) GetVersion() int16        { return v.Version }
func (v *DescribeProducersResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeProducersResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *DescribeProducersResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeProducersResponse) RequestKind() Request {
	return &DescribeProducersRequest{Version: v.Version}
}

func (v *DescribeProducersResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ActiveProducers
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.ProducerID
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.ProducerEpoch
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.LastSequence
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.LastTimestamp
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.CoordinatorEpoch
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.CurrentTxnStartOffset
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeProducersResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeProducersResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeProducersResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeProducersResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeProducersResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := s.ActiveProducers
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeProducersResponseTopicPartitionActiveProducer, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.ProducerID = v
							}
							{
								v := b.Int32()
								s.ProducerEpoch = v
							}
							{
								v := b.Int32()
								s.LastSequence = v
							}
							{
								v := b.Int64()
								s.LastTimestamp = v
							}
							{
								v := b.Int32()
								s.CoordinatorEpoch = v
							}
							{
								v := b.Int64()
								s.CurrentTxnStartOffset = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.ActiveProducers = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeProducersResponse returns a pointer to a default DescribeProducersResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeProducersResponse() *DescribeProducersResponse {
	var v DescribeProducersResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeProducersResponse.
func (v *DescribeProducersResponse) Default() {
}

// NewDescribeProducersResponse returns a default DescribeProducersResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeProducersResponse() DescribeProducersResponse {
	var v DescribeProducersResponse
	v.Default()
	return v
}

type BrokerRegistrationRequestListener struct {
	// The name of this endpoint.
	Name string

	// The hostname.
	Host string

	// The port.
	Port uint16

	// The security protocol.
	SecurityProtocol int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerRegistrationRequestListener.
func (v *BrokerRegistrationRequestListener) Default() {
}

// NewBrokerRegistrationRequestListener returns a default BrokerRegistrationRequestListener
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerRegistrationRequestListener() BrokerRegistrationRequestListener {
	var v BrokerRegistrationRequestListener
	v.Default()
	return v
}

type BrokerRegistrationRequestFeature struct {
	// The name of the feature.
	Name string

	// The minimum supported feature level.
	MinSupportedVersion int16

	// The maximum supported feature level.
	MaxSupportedVersion int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerRegistrationRequestFeature.
func (v *BrokerRegistrationRequestFeature) Default() {
}

// NewBrokerRegistrationRequestFeature returns a default BrokerRegistrationRequestFeature
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerRegistrationRequestFeature() BrokerRegistrationRequestFeature {
	var v BrokerRegistrationRequestFeature
	v.Default()
	return v
}

// For KIP-500 / KIP-631, BrokerRegistrationRequest is an internal
// broker-to-broker only request.
type BrokerRegistrationRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The broker ID.
	BrokerID int32

	// The cluster ID of the broker process.
	ClusterID string

	// The incarnation ID of the broker process.
	IncarnationID [16]byte

	// The listeners for this broker.
	Listeners []BrokerRegistrationRequestListener

	// Features on this broker.
	Features []BrokerRegistrationRequestFeature

	// The rack that this broker is in, if any.
	Rack *string

	// If the required configurations for ZK migration are present, this value is
	// set to true.
	IsMigratingZkBroker bool // v1+

	// Log directories configured in this broker which are available.,
	LogDirs [][16]byte // v2+

	// The epoch before a clean shutdown.
	//
	// This field has a default of -1.
	PreviousBrokerEpoch int64 // v3+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*BrokerRegistrationRequest) Key() int16                 { return 62 }
func (*BrokerRegistrationRequest) MaxVersion() int16          { return 4 }
func (v *BrokerRegistrationRequest) SetVersion(version int16) { v.Version = version }
func (v *BrokerRegistrationRequest) GetVersion() int16        { return v.Version }
func (v *BrokerRegistrationRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *BrokerRegistrationRequest) ResponseKind() Response {
	r := &BrokerRegistrationResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *BrokerRegistrationRequest) RequestWith(ctx context.Context, r Requestor) (*BrokerRegistrationResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*BrokerRegistrationResponse)
	return resp, err
}

func (v *BrokerRegistrationRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.IncarnationID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.Listeners
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			{
				v := v.SecurityProtocol
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.Features
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.MinSupportedVersion
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.MaxSupportedVersion
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.Rack
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.IsMigratingZkBroker
		dst = kbin.AppendBool(dst, v)
	}
	if version >= 2 {
		v := v.LogDirs
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			dst = kbin.AppendUuid(dst, v)
		}
	}
	if version >= 3 {
		v := v.PreviousBrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BrokerRegistrationRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BrokerRegistrationRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BrokerRegistrationRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.ClusterID = v
	}
	{
		v := b.Uuid()
		s.IncarnationID = v
	}
	{
		v := s.Listeners
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]BrokerRegistrationRequestListener, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			{
				v := b.Int16()
				s.SecurityProtocol = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Listeners = v
	}
	{
		v := s.Features
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]BrokerRegistrationRequestFeature, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				v := b.Int16()
				s.MinSupportedVersion = v
			}
			{
				v := b.Int16()
				s.MaxSupportedVersion = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Features = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.Rack = v
	}
	if version >= 1 {
		v := b.Bool()
		s.IsMigratingZkBroker = v
	}
	if version >= 2 {
		v := s.LogDirs
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([][16]byte, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := b.Uuid()
			a[i] = v
		}
		v = a
		s.LogDirs = v
	}
	if version >= 3 {
		v := b.Int64()
		s.PreviousBrokerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrBrokerRegistrationRequest returns a pointer to a default BrokerRegistrationRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBrokerRegistrationRequest() *BrokerRegistrationRequest {
	var v BrokerRegistrationRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerRegistrationRequest.
func (v *BrokerRegistrationRequest) Default() {
	v.PreviousBrokerEpoch = -1
}

// NewBrokerRegistrationRequest returns a default BrokerRegistrationRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerRegistrationRequest() BrokerRegistrationRequest {
	var v BrokerRegistrationRequest
	v.Default()
	return v
}

// BrokerRegistrationResponse is a response to a BrokerRegistrationRequest.
type BrokerRegistrationResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Any error code, or 0.
	ErrorCode int16

	// The broker's assigned epoch, or -1 if none was assigned.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*BrokerRegistrationResponse) Key() int16                 { return 62 }
func (*BrokerRegistrationResponse) MaxVersion() int16          { return 4 }
func (v *BrokerRegistrationResponse) SetVersion(version int16) { v.Version = version }
func (v *BrokerRegistrationResponse) GetVersion() int16        { return v.Version }
func (v *BrokerRegistrationResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *BrokerRegistrationResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *BrokerRegistrationResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *BrokerRegistrationResponse) RequestKind() Request {
	return &BrokerRegistrationRequest{Version: v.Version}
}

func (v *BrokerRegistrationResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BrokerRegistrationResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BrokerRegistrationResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BrokerRegistrationResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrBrokerRegistrationResponse returns a pointer to a default BrokerRegistrationResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBrokerRegistrationResponse() *BrokerRegistrationResponse {
	var v BrokerRegistrationResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerRegistrationResponse.
func (v *BrokerRegistrationResponse) Default() {
	v.BrokerEpoch = -1
}

// NewBrokerRegistrationResponse returns a default BrokerRegistrationResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerRegistrationResponse() BrokerRegistrationResponse {
	var v BrokerRegistrationResponse
	v.Default()
	return v
}

// For KIP-500 / KIP-631, BrokerHeartbeatRequest is an internal
// broker-to-broker only request.
type BrokerHeartbeatRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The broker ID.
	BrokerID int32

	// The broker's epoch.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	// The highest metadata offset that the broker has reached.
	CurrentMetadataOffset int64

	// True if the broker wants to be fenced.
	WantFence bool

	// True if the broker wants to be shutdown.
	WantShutdown bool

	// Log directories that failed and went offline.
	OfflineLogDirs [][16]byte // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*BrokerHeartbeatRequest) Key() int16                 { return 63 }
func (*BrokerHeartbeatRequest) MaxVersion() int16          { return 1 }
func (v *BrokerHeartbeatRequest) SetVersion(version int16) { v.Version = version }
func (v *BrokerHeartbeatRequest) GetVersion() int16        { return v.Version }
func (v *BrokerHeartbeatRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *BrokerHeartbeatRequest) ResponseKind() Response {
	r := &BrokerHeartbeatResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *BrokerHeartbeatRequest) RequestWith(ctx context.Context, r Requestor) (*BrokerHeartbeatResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*BrokerHeartbeatResponse)
	return resp, err
}

func (v *BrokerHeartbeatRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.CurrentMetadataOffset
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.WantFence
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.WantShutdown
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if len(v.OfflineLogDirs) > 0 {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.OfflineLogDirs
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fOfflineLogDirs:
					if isFlexible {
						dst = kbin.AppendCompactArrayLen(dst, len(v))
					} else {
						dst = kbin.AppendArrayLen(dst, len(v))
					}
					for i := range v {
						v := v[i]
						dst = kbin.AppendUuid(dst, v)
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fOfflineLogDirs
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BrokerHeartbeatRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BrokerHeartbeatRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BrokerHeartbeatRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	{
		v := b.Int64()
		s.BrokerEpoch = v
	}
	{
		v := b.Int64()
		s.CurrentMetadataOffset = v
	}
	{
		v := b.Bool()
		s.WantFence = v
	}
	{
		v := b.Bool()
		s.WantShutdown = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := s.OfflineLogDirs
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([][16]byte, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Uuid()
					a[i] = v
				}
				v = a
				s.OfflineLogDirs = v
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrBrokerHeartbeatRequest returns a pointer to a default BrokerHeartbeatRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBrokerHeartbeatRequest() *BrokerHeartbeatRequest {
	var v BrokerHeartbeatRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerHeartbeatRequest.
func (v *BrokerHeartbeatRequest) Default() {
	v.BrokerEpoch = -1
}

// NewBrokerHeartbeatRequest returns a default BrokerHeartbeatRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerHeartbeatRequest() BrokerHeartbeatRequest {
	var v BrokerHeartbeatRequest
	v.Default()
	return v
}

// BrokerHeartbeatResponse is a response to a BrokerHeartbeatRequest.
type BrokerHeartbeatResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Any error code, or 0.
	ErrorCode int16

	// True if the broker has approximately caught up with the latest metadata.
	IsCaughtUp bool

	// True if the broker is fenced.
	//
	// This field has a default of true.
	IsFenced bool

	// True if the broker should proceed with its shutdown.
	ShouldShutdown bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*BrokerHeartbeatResponse) Key() int16                 { return 63 }
func (*BrokerHeartbeatResponse) MaxVersion() int16          { return 1 }
func (v *BrokerHeartbeatResponse) SetVersion(version int16) { v.Version = version }
func (v *BrokerHeartbeatResponse) GetVersion() int16        { return v.Version }
func (v *BrokerHeartbeatResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *BrokerHeartbeatResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *BrokerHeartbeatResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *BrokerHeartbeatResponse) RequestKind() Request {
	return &BrokerHeartbeatRequest{Version: v.Version}
}

func (v *BrokerHeartbeatResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.IsCaughtUp
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.IsFenced
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.ShouldShutdown
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *BrokerHeartbeatResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *BrokerHeartbeatResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *BrokerHeartbeatResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Bool()
		s.IsCaughtUp = v
	}
	{
		v := b.Bool()
		s.IsFenced = v
	}
	{
		v := b.Bool()
		s.ShouldShutdown = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrBrokerHeartbeatResponse returns a pointer to a default BrokerHeartbeatResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrBrokerHeartbeatResponse() *BrokerHeartbeatResponse {
	var v BrokerHeartbeatResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to BrokerHeartbeatResponse.
func (v *BrokerHeartbeatResponse) Default() {
	v.IsFenced = true
}

// NewBrokerHeartbeatResponse returns a default BrokerHeartbeatResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewBrokerHeartbeatResponse() BrokerHeartbeatResponse {
	var v BrokerHeartbeatResponse
	v.Default()
	return v
}

// For KIP-500 / KIP-631, UnregisterBrokerRequest is an admin request to
// remove registration of a broker from the cluster.
type UnregisterBrokerRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The broker ID to unregister.
	BrokerID int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UnregisterBrokerRequest) Key() int16                 { return 64 }
func (*UnregisterBrokerRequest) MaxVersion() int16          { return 0 }
func (v *UnregisterBrokerRequest) SetVersion(version int16) { v.Version = version }
func (v *UnregisterBrokerRequest) GetVersion() int16        { return v.Version }
func (v *UnregisterBrokerRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *UnregisterBrokerRequest) ResponseKind() Response {
	r := &UnregisterBrokerResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *UnregisterBrokerRequest) RequestWith(ctx context.Context, r Requestor) (*UnregisterBrokerResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*UnregisterBrokerResponse)
	return resp, err
}

func (v *UnregisterBrokerRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UnregisterBrokerRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UnregisterBrokerRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UnregisterBrokerRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUnregisterBrokerRequest returns a pointer to a default UnregisterBrokerRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUnregisterBrokerRequest() *UnregisterBrokerRequest {
	var v UnregisterBrokerRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UnregisterBrokerRequest.
func (v *UnregisterBrokerRequest) Default() {
}

// NewUnregisterBrokerRequest returns a default UnregisterBrokerRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewUnregisterBrokerRequest() UnregisterBrokerRequest {
	var v UnregisterBrokerRequest
	v.Default()
	return v
}

// UnregisterBrokerResponse is a response to a UnregisterBrokerRequest.
type UnregisterBrokerResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Any error code, or 0.
	ErrorCode int16

	// The error message, if any.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UnregisterBrokerResponse) Key() int16                 { return 64 }
func (*UnregisterBrokerResponse) MaxVersion() int16          { return 0 }
func (v *UnregisterBrokerResponse) SetVersion(version int16) { v.Version = version }
func (v *UnregisterBrokerResponse) GetVersion() int16        { return v.Version }
func (v *UnregisterBrokerResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *UnregisterBrokerResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *UnregisterBrokerResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *UnregisterBrokerResponse) RequestKind() Request {
	return &UnregisterBrokerRequest{Version: v.Version}
}

func (v *UnregisterBrokerResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UnregisterBrokerResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UnregisterBrokerResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UnregisterBrokerResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUnregisterBrokerResponse returns a pointer to a default UnregisterBrokerResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUnregisterBrokerResponse() *UnregisterBrokerResponse {
	var v UnregisterBrokerResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UnregisterBrokerResponse.
func (v *UnregisterBrokerResponse) Default() {
}

// NewUnregisterBrokerResponse returns a default UnregisterBrokerResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewUnregisterBrokerResponse() UnregisterBrokerResponse {
	var v UnregisterBrokerResponse
	v.Default()
	return v
}

// For KIP-664, DescribeTransactionsRequest describes the state of transactions.
type DescribeTransactionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Array of transactionalIds to include in describe results. If empty, then
	// no results will be returned.
	TransactionalIDs []string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeTransactionsRequest) Key() int16                 { return 65 }
func (*DescribeTransactionsRequest) MaxVersion() int16          { return 0 }
func (v *DescribeTransactionsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeTransactionsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeTransactionsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeTransactionsRequest) ResponseKind() Response {
	r := &DescribeTransactionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeTransactionsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeTransactionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeTransactionsResponse)
	return resp, err
}

func (v *DescribeTransactionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.TransactionalIDs
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeTransactionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeTransactionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeTransactionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.TransactionalIDs
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.TransactionalIDs = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeTransactionsRequest returns a pointer to a default DescribeTransactionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeTransactionsRequest() *DescribeTransactionsRequest {
	var v DescribeTransactionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTransactionsRequest.
func (v *DescribeTransactionsRequest) Default() {
}

// NewDescribeTransactionsRequest returns a default DescribeTransactionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTransactionsRequest() DescribeTransactionsRequest {
	var v DescribeTransactionsRequest
	v.Default()
	return v
}

type DescribeTransactionsResponseTransactionStateTopic struct {
	Topic string

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTransactionsResponseTransactionStateTopic.
func (v *DescribeTransactionsResponseTransactionStateTopic) Default() {
}

// NewDescribeTransactionsResponseTransactionStateTopic returns a default DescribeTransactionsResponseTransactionStateTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTransactionsResponseTransactionStateTopic() DescribeTransactionsResponseTransactionStateTopic {
	var v DescribeTransactionsResponseTransactionStateTopic
	v.Default()
	return v
}

type DescribeTransactionsResponseTransactionState struct {
	// A potential error code for describing this transaction.
	//
	// NOT_COORDINATOR is returned if the broker receiving this transactional
	// ID does not own the ID.
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the coordinator is loading.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator is being shutdown.
	//
	// TRANSACTIONAL_ID_NOT_FOUND is returned if the transactional ID could not be found.
	//
	// TRANSACTIONAL_ID_AUTHORIZATION_FAILED is returned if the user does not have
	// Describe permissions on the transactional ID.
	ErrorCode int16

	// TransactionalID is the transactional ID this record is for.
	TransactionalID string

	// State is the state the transaction is in.
	State string

	// TimeoutMillis is the timeout of this transaction in milliseconds.
	TimeoutMillis int32

	// StartTimestamp is the timestamp in millis of when this transaction started.
	StartTimestamp int64

	// ProducerID is the ID in use by the transactional ID.
	ProducerID int64

	// ProducerEpoch is the epoch associated with the producer ID.
	ProducerEpoch int16

	// The set of partitions included in the current transaction (if active).
	// When a transaction is preparing to commit or abort, this will include
	// only partitions which do not have markers.
	//
	// This does not include topics the user is not authorized to describe.
	Topics []DescribeTransactionsResponseTransactionStateTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTransactionsResponseTransactionState.
func (v *DescribeTransactionsResponseTransactionState) Default() {
}

// NewDescribeTransactionsResponseTransactionState returns a default DescribeTransactionsResponseTransactionState
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTransactionsResponseTransactionState() DescribeTransactionsResponseTransactionState {
	var v DescribeTransactionsResponseTransactionState
	v.Default()
	return v
}

// DescribeTransactionsResponse is a response to a DescribeTransactionsRequest.
type DescribeTransactionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	TransactionStates []DescribeTransactionsResponseTransactionState

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeTransactionsResponse) Key() int16                 { return 65 }
func (*DescribeTransactionsResponse) MaxVersion() int16          { return 0 }
func (v *DescribeTransactionsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeTransactionsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeTransactionsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeTransactionsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DescribeTransactionsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeTransactionsResponse) RequestKind() Request {
	return &DescribeTransactionsRequest{Version: v.Version}
}

func (v *DescribeTransactionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.TransactionStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.TransactionalID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.State
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.TimeoutMillis
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.StartTimestamp
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.ProducerID
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.ProducerEpoch
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeTransactionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeTransactionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeTransactionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.TransactionStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeTransactionsResponseTransactionState, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TransactionalID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.State = v
			}
			{
				v := b.Int32()
				s.TimeoutMillis = v
			}
			{
				v := b.Int64()
				s.StartTimestamp = v
			}
			{
				v := b.Int64()
				s.ProducerID = v
			}
			{
				v := b.Int16()
				s.ProducerEpoch = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeTransactionsResponseTransactionStateTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TransactionStates = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeTransactionsResponse returns a pointer to a default DescribeTransactionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeTransactionsResponse() *DescribeTransactionsResponse {
	var v DescribeTransactionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTransactionsResponse.
func (v *DescribeTransactionsResponse) Default() {
}

// NewDescribeTransactionsResponse returns a default DescribeTransactionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTransactionsResponse() DescribeTransactionsResponse {
	var v DescribeTransactionsResponse
	v.Default()
	return v
}

// For KIP-664, ListTransactionsRequest lists transactions.
type ListTransactionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The transaction states to filter by: if empty, all transactions are
	// returned; if non-empty, then only transactions matching one of the
	// filtered states will be returned.
	//
	// For a list of valid states, see the TransactionState enum.
	StateFilters []string

	// The producer IDs to filter by: if empty, all transactions will be
	// returned; if non-empty, only transactions which match one of the filtered
	// producer IDs will be returned.
	ProducerIDFilters []int64

	// Duration (in millis) to filter by: if < 0, all transactions will be
	// returned; otherwise, only transactions running longer than this duration
	// will be returned.
	//
	// This field has a default of -1.
	DurationFilterMillis int64 // v1+

	// The transactional ID regular expression pattern to filter by: if it is
	// empty or null, all transactions are returned; otherwise then only the
	// transactions matching the given regular expression will be returned.
	// Uses re2 syntax.
	TransactionalIDPattern *string // v2+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListTransactionsRequest) Key() int16                 { return 66 }
func (*ListTransactionsRequest) MaxVersion() int16          { return 2 }
func (v *ListTransactionsRequest) SetVersion(version int16) { v.Version = version }
func (v *ListTransactionsRequest) GetVersion() int16        { return v.Version }
func (v *ListTransactionsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListTransactionsRequest) ResponseKind() Response {
	r := &ListTransactionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ListTransactionsRequest) RequestWith(ctx context.Context, r Requestor) (*ListTransactionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ListTransactionsResponse)
	return resp, err
}

func (v *ListTransactionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.StateFilters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	{
		v := v.ProducerIDFilters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			dst = kbin.AppendInt64(dst, v)
		}
	}
	if version >= 1 {
		v := v.DurationFilterMillis
		dst = kbin.AppendInt64(dst, v)
	}
	if version >= 2 {
		v := v.TransactionalIDPattern
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListTransactionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListTransactionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListTransactionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.StateFilters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.StateFilters = v
	}
	{
		v := s.ProducerIDFilters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]int64, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := b.Int64()
			a[i] = v
		}
		v = a
		s.ProducerIDFilters = v
	}
	if version >= 1 {
		v := b.Int64()
		s.DurationFilterMillis = v
	}
	if version >= 2 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.TransactionalIDPattern = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListTransactionsRequest returns a pointer to a default ListTransactionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListTransactionsRequest() *ListTransactionsRequest {
	var v ListTransactionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListTransactionsRequest.
func (v *ListTransactionsRequest) Default() {
	v.DurationFilterMillis = -1
}

// NewListTransactionsRequest returns a default ListTransactionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewListTransactionsRequest() ListTransactionsRequest {
	var v ListTransactionsRequest
	v.Default()
	return v
}

type ListTransactionsResponseTransactionState struct {
	// The transactional ID being used.
	TransactionalID string

	// The producer ID of the producer.
	ProducerID int64

	// The current transaction state of the producer.
	TransactionState string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListTransactionsResponseTransactionState.
func (v *ListTransactionsResponseTransactionState) Default() {
}

// NewListTransactionsResponseTransactionState returns a default ListTransactionsResponseTransactionState
// This is a shortcut for creating a struct and calling Default yourself.
func NewListTransactionsResponseTransactionState() ListTransactionsResponseTransactionState {
	var v ListTransactionsResponseTransactionState
	v.Default()
	return v
}

// ListTransactionsResponse is a response to a ListTransactionsRequest.
type ListTransactionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// A potential error code for the listing,
	//
	// COORDINATOR_LOAD_IN_PROGRESS is returned if the coordinator is loading.
	//
	// COORDINATOR_NOT_AVAILABLE is returned if the coordinator receiving this
	// request is shutting down.
	//
	// INVALID_REGULAR_EXPRESSION is returned if using an invalid regex in
	// the request's transactional id pattern field.
	ErrorCode int16

	// Set of state filters provided in the request which were unknown to the
	// transaction coordinator.
	UnknownStateFilters []string

	// TransactionStates contains all transactions that were matched for listing
	// in the request. The response elides transactions that the user does not have
	// permission to describe (DESCRIBE on TRANSACTIONAL_ID for the transaction).
	TransactionStates []ListTransactionsResponseTransactionState

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListTransactionsResponse) Key() int16                 { return 66 }
func (*ListTransactionsResponse) MaxVersion() int16          { return 2 }
func (v *ListTransactionsResponse) SetVersion(version int16) { v.Version = version }
func (v *ListTransactionsResponse) GetVersion() int16        { return v.Version }
func (v *ListTransactionsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListTransactionsResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *ListTransactionsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ListTransactionsResponse) RequestKind() Request {
	return &ListTransactionsRequest{Version: v.Version}
}

func (v *ListTransactionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.UnknownStateFilters
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	{
		v := v.TransactionStates
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TransactionalID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.ProducerID
				dst = kbin.AppendInt64(dst, v)
			}
			{
				v := v.TransactionState
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListTransactionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListTransactionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListTransactionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.UnknownStateFilters
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.UnknownStateFilters = v
	}
	{
		v := s.TransactionStates
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListTransactionsResponseTransactionState, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TransactionalID = v
			}
			{
				v := b.Int64()
				s.ProducerID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.TransactionState = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TransactionStates = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListTransactionsResponse returns a pointer to a default ListTransactionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListTransactionsResponse() *ListTransactionsResponse {
	var v ListTransactionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListTransactionsResponse.
func (v *ListTransactionsResponse) Default() {
}

// NewListTransactionsResponse returns a default ListTransactionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewListTransactionsResponse() ListTransactionsResponse {
	var v ListTransactionsResponse
	v.Default()
	return v
}

// For KIP-730, AllocateProducerIDsRequest is a broker-to-broker request that
// requests a block of producer IDs from the controller broker. This is more
// specifically introduced for raft, but allows for one more request to avoid
// zookeeper in the non-raft world as well.
type AllocateProducerIDsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The ID of the requesting broker.
	BrokerID int32

	// The epoch of the requesting broker.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AllocateProducerIDsRequest) Key() int16                 { return 67 }
func (*AllocateProducerIDsRequest) MaxVersion() int16          { return 0 }
func (v *AllocateProducerIDsRequest) SetVersion(version int16) { v.Version = version }
func (v *AllocateProducerIDsRequest) GetVersion() int16        { return v.Version }
func (v *AllocateProducerIDsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *AllocateProducerIDsRequest) ResponseKind() Response {
	r := &AllocateProducerIDsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AllocateProducerIDsRequest) RequestWith(ctx context.Context, r Requestor) (*AllocateProducerIDsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AllocateProducerIDsResponse)
	return resp, err
}

func (v *AllocateProducerIDsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AllocateProducerIDsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AllocateProducerIDsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AllocateProducerIDsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	{
		v := b.Int64()
		s.BrokerEpoch = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAllocateProducerIDsRequest returns a pointer to a default AllocateProducerIDsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAllocateProducerIDsRequest() *AllocateProducerIDsRequest {
	var v AllocateProducerIDsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AllocateProducerIDsRequest.
func (v *AllocateProducerIDsRequest) Default() {
	v.BrokerEpoch = -1
}

// NewAllocateProducerIDsRequest returns a default AllocateProducerIDsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAllocateProducerIDsRequest() AllocateProducerIDsRequest {
	var v AllocateProducerIDsRequest
	v.Default()
	return v
}

// AllocateProducerIDsResponse is a response to an AllocateProducerIDsRequest.
type AllocateProducerIDsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// An error code, if any.
	ErrorCode int16

	// The first producer ID in this range, inclusive.
	ProducerIDStart int64

	// The number of producer IDs in this range.
	ProducerIDLen int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AllocateProducerIDsResponse) Key() int16                 { return 67 }
func (*AllocateProducerIDsResponse) MaxVersion() int16          { return 0 }
func (v *AllocateProducerIDsResponse) SetVersion(version int16) { v.Version = version }
func (v *AllocateProducerIDsResponse) GetVersion() int16        { return v.Version }
func (v *AllocateProducerIDsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *AllocateProducerIDsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *AllocateProducerIDsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AllocateProducerIDsResponse) RequestKind() Request {
	return &AllocateProducerIDsRequest{Version: v.Version}
}

func (v *AllocateProducerIDsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ProducerIDStart
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.ProducerIDLen
		dst = kbin.AppendInt32(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AllocateProducerIDsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AllocateProducerIDsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AllocateProducerIDsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Int64()
		s.ProducerIDStart = v
	}
	{
		v := b.Int32()
		s.ProducerIDLen = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAllocateProducerIDsResponse returns a pointer to a default AllocateProducerIDsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAllocateProducerIDsResponse() *AllocateProducerIDsResponse {
	var v AllocateProducerIDsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AllocateProducerIDsResponse.
func (v *AllocateProducerIDsResponse) Default() {
}

// NewAllocateProducerIDsResponse returns a default AllocateProducerIDsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAllocateProducerIDsResponse() AllocateProducerIDsResponse {
	var v AllocateProducerIDsResponse
	v.Default()
	return v
}

type ConsumerGroupHeartbeatRequestTopic struct {
	// The topic ID.
	TopicID [16]byte

	// The partitions.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupHeartbeatRequestTopic.
func (v *ConsumerGroupHeartbeatRequestTopic) Default() {
}

// NewConsumerGroupHeartbeatRequestTopic returns a default ConsumerGroupHeartbeatRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupHeartbeatRequestTopic() ConsumerGroupHeartbeatRequestTopic {
	var v ConsumerGroupHeartbeatRequestTopic
	v.Default()
	return v
}

// ConsumerGroupHeartbeat is a part of KIP-848; there are a lot of details
// to this request so documentation is left to the KIP itself.
type ConsumerGroupHeartbeatRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The group ID.
	Group string

	// The member ID generated by the coordinator. This must be kept during
	// the entire lifetime of the member.
	MemberID string

	// The current member epoch; 0 to join the group, -1 to leave, -2 to
	// indicate that the static member will rejoin.
	MemberEpoch int32

	// Instance ID of the member; null if not provided or if unchanging.
	InstanceID *string

	// The rack ID of the member; null if not provided or if unchanging.
	RackID *string

	// RebalanceTimeoutMillis is how long the coordinator will wait on a member
	// to revoke its partitions. -1 if unchanging.
	//
	// This field has a default of -1.
	RebalanceTimeoutMillis int32

	// Subscribed topics; null if unchanging.
	SubscribedTopicNames []string

	// Subscribed topic regex; null if unchanging.
	SubscribedTopicRegex *string // v1+

	// The server side assignor to use; null if unchanging.
	ServerAssignor *string

	// Topic partitions owned by the member; null if unchanging.
	Topics []ConsumerGroupHeartbeatRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ConsumerGroupHeartbeatRequest) Key() int16                   { return 68 }
func (*ConsumerGroupHeartbeatRequest) MaxVersion() int16            { return 1 }
func (v *ConsumerGroupHeartbeatRequest) SetVersion(version int16)   { v.Version = version }
func (v *ConsumerGroupHeartbeatRequest) GetVersion() int16          { return v.Version }
func (v *ConsumerGroupHeartbeatRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *ConsumerGroupHeartbeatRequest) IsGroupCoordinatorRequest() {}
func (v *ConsumerGroupHeartbeatRequest) ResponseKind() Response {
	r := &ConsumerGroupHeartbeatResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ConsumerGroupHeartbeatRequest) RequestWith(ctx context.Context, r Requestor) (*ConsumerGroupHeartbeatResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ConsumerGroupHeartbeatResponse)
	return resp, err
}

func (v *ConsumerGroupHeartbeatRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.RackID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.RebalanceTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.SubscribedTopicNames
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if version >= 1 {
		v := v.SubscribedTopicRegex
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.ServerAssignor
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ConsumerGroupHeartbeatRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerGroupHeartbeatRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerGroupHeartbeatRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.RackID = v
	}
	{
		v := b.Int32()
		s.RebalanceTimeoutMillis = v
	}
	{
		v := s.SubscribedTopicNames
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []string{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.SubscribedTopicNames = v
	}
	if version >= 1 {
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.SubscribedTopicRegex = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ServerAssignor = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []ConsumerGroupHeartbeatRequestTopic{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConsumerGroupHeartbeatRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrConsumerGroupHeartbeatRequest returns a pointer to a default ConsumerGroupHeartbeatRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrConsumerGroupHeartbeatRequest() *ConsumerGroupHeartbeatRequest {
	var v ConsumerGroupHeartbeatRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupHeartbeatRequest.
func (v *ConsumerGroupHeartbeatRequest) Default() {
	v.RebalanceTimeoutMillis = -1
}

// NewConsumerGroupHeartbeatRequest returns a default ConsumerGroupHeartbeatRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupHeartbeatRequest() ConsumerGroupHeartbeatRequest {
	var v ConsumerGroupHeartbeatRequest
	v.Default()
	return v
}

type ConsumerGroupHeartbeatResponseAssignmentTopic struct {
	TopicID [16]byte

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupHeartbeatResponseAssignmentTopic.
func (v *ConsumerGroupHeartbeatResponseAssignmentTopic) Default() {
}

// NewConsumerGroupHeartbeatResponseAssignmentTopic returns a default ConsumerGroupHeartbeatResponseAssignmentTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupHeartbeatResponseAssignmentTopic() ConsumerGroupHeartbeatResponseAssignmentTopic {
	var v ConsumerGroupHeartbeatResponseAssignmentTopic
	v.Default()
	return v
}

type ConsumerGroupHeartbeatResponseAssignment struct {
	// The topics partitions that can be used immediately.
	Topics []ConsumerGroupHeartbeatResponseAssignmentTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupHeartbeatResponseAssignment.
func (v *ConsumerGroupHeartbeatResponseAssignment) Default() {
}

// NewConsumerGroupHeartbeatResponseAssignment returns a default ConsumerGroupHeartbeatResponseAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupHeartbeatResponseAssignment() ConsumerGroupHeartbeatResponseAssignment {
	var v ConsumerGroupHeartbeatResponseAssignment
	v.Default()
	return v
}

// ConsumerGroupHeartbeatResponse is returned from a ConsumerGroupHeartbeatRequest.
type ConsumerGroupHeartbeatResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the error for this response.
	//
	// Supported errors:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - NOT_COORDINATOR (version 0+)
	// - COORDINATOR_NOT_AVAILABLE (version 0+)
	// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
	// - INVALID_REQUEST (version 0+)
	// - UNKNOWN_MEMBER_ID (version 0+)
	// - FENCED_MEMBER_EPOCH (version 0+)
	// - UNSUPPORTED_ASSIGNOR (version 0+)
	// - UNRELEASED_INSTANCE_ID (version 0+)
	// - GROUP_MAX_SIZE_REACHED (version 0+)
	// - INVALID_REGULAR_EXPRESSION (version 1+)
	ErrorCode int16

	// A supplementary message if this errored.
	ErrorMessage *string

	// The member ID generated by the coordinator; provided when joining
	// with MemberEpoch=0.
	MemberID *string

	// The member epoch.
	MemberEpoch int32

	// The heartbeat interval, in milliseconds.
	HeartbeatIntervalMillis int32

	// The assignment; null if not provided.
	Assignment *ConsumerGroupHeartbeatResponseAssignment

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ConsumerGroupHeartbeatResponse) Key() int16                 { return 68 }
func (*ConsumerGroupHeartbeatResponse) MaxVersion() int16          { return 1 }
func (v *ConsumerGroupHeartbeatResponse) SetVersion(version int16) { v.Version = version }
func (v *ConsumerGroupHeartbeatResponse) GetVersion() int16        { return v.Version }
func (v *ConsumerGroupHeartbeatResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ConsumerGroupHeartbeatResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ConsumerGroupHeartbeatResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ConsumerGroupHeartbeatResponse) RequestKind() Request {
	return &ConsumerGroupHeartbeatRequest{Version: v.Version}
}

func (v *ConsumerGroupHeartbeatResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.HeartbeatIntervalMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Assignment
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ConsumerGroupHeartbeatResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerGroupHeartbeatResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerGroupHeartbeatResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		v := b.Int32()
		s.HeartbeatIntervalMillis = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.Assignment = new(ConsumerGroupHeartbeatResponseAssignment)
			v := s.Assignment
			v.Default()
			s := v
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ConsumerGroupHeartbeatResponseAssignmentTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrConsumerGroupHeartbeatResponse returns a pointer to a default ConsumerGroupHeartbeatResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrConsumerGroupHeartbeatResponse() *ConsumerGroupHeartbeatResponse {
	var v ConsumerGroupHeartbeatResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupHeartbeatResponse.
func (v *ConsumerGroupHeartbeatResponse) Default() {
	{
		v := &v.Assignment
		_ = v
	}
}

// NewConsumerGroupHeartbeatResponse returns a default ConsumerGroupHeartbeatResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupHeartbeatResponse() ConsumerGroupHeartbeatResponse {
	var v ConsumerGroupHeartbeatResponse
	v.Default()
	return v
}

// Assignment contains consumer group assignments.
type Assignment struct {
	// The topics & partitions assigned to the member.
	TopicPartitions []AssignmentTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to Assignment.
func (v *Assignment) Default() {
}

// NewAssignment returns a default Assignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignment() Assignment {
	var v Assignment
	v.Default()
	return v
}

// ConsumerGroupDescribe is a part of KIP-848; this is the
// "next generation" equivalent of DescribeGroups.
type ConsumerGroupDescribeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The IDs of the groups to describe.
	Groups []string

	// Whether to include authorized operations.
	IncludeAuthorizedOperations bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ConsumerGroupDescribeRequest) Key() int16                 { return 69 }
func (*ConsumerGroupDescribeRequest) MaxVersion() int16          { return 1 }
func (v *ConsumerGroupDescribeRequest) SetVersion(version int16) { v.Version = version }
func (v *ConsumerGroupDescribeRequest) GetVersion() int16        { return v.Version }
func (v *ConsumerGroupDescribeRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ConsumerGroupDescribeRequest) ResponseKind() Response {
	r := &ConsumerGroupDescribeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ConsumerGroupDescribeRequest) RequestWith(ctx context.Context, r Requestor) (*ConsumerGroupDescribeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ConsumerGroupDescribeResponse)
	return resp, err
}

func (v *ConsumerGroupDescribeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	{
		v := v.IncludeAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ConsumerGroupDescribeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerGroupDescribeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerGroupDescribeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.Groups = v
	}
	{
		v := b.Bool()
		s.IncludeAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrConsumerGroupDescribeRequest returns a pointer to a default ConsumerGroupDescribeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrConsumerGroupDescribeRequest() *ConsumerGroupDescribeRequest {
	var v ConsumerGroupDescribeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupDescribeRequest.
func (v *ConsumerGroupDescribeRequest) Default() {
}

// NewConsumerGroupDescribeRequest returns a default ConsumerGroupDescribeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupDescribeRequest() ConsumerGroupDescribeRequest {
	var v ConsumerGroupDescribeRequest
	v.Default()
	return v
}

type ConsumerGroupDescribeResponseGroupMember struct {
	// The member ID.
	MemberID string

	// The member instance ID, if any.
	InstanceID *string

	// The member rack ID, if any.
	RackID *string

	// The current member epoch.
	MemberEpoch int32

	// The client ID.
	ClientID string

	// The client host.
	ClientHost string

	// The subscribed topic names.
	SubscribedTopics []string

	// The subscribed topic regex, if any.
	SubscribedTopicRegex *string

	// The current assignment.
	Assignment Assignment

	// The target assignment.
	TargetAssignment Assignment

	// The member type;  -1 for unknown. 0 for classic member. +1 for consumer member.
	//
	// This field has a default of -1.
	MemberType int8 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupDescribeResponseGroupMember.
func (v *ConsumerGroupDescribeResponseGroupMember) Default() {
	{
		v := &v.Assignment
		_ = v
	}
	{
		v := &v.TargetAssignment
		_ = v
	}
	v.MemberType = -1
}

// NewConsumerGroupDescribeResponseGroupMember returns a default ConsumerGroupDescribeResponseGroupMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupDescribeResponseGroupMember() ConsumerGroupDescribeResponseGroupMember {
	var v ConsumerGroupDescribeResponseGroupMember
	v.Default()
	return v
}

type ConsumerGroupDescribeResponseGroup struct {
	// ErrorCode is the error for this response.
	//
	// Supported errors:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - NOT_COORDINATOR (version 0+)
	// - COORDINATOR_NOT_AVAILABLE (version 0+)
	// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
	// - INVALID_REQUEST (version 0+)
	// - INVALID_GROUP_ID (version 0+)
	// - GROUP_ID_NOT_FOUND (version 0+)
	ErrorCode int16

	// A supplementary message if this errored.
	ErrorMessage *string

	// The group ID.
	Group string

	// The group state.
	State string

	// The group epoch.
	Epoch int32

	// The assignment epoch.
	AssignmentEpoch int32

	// The selected assignor.
	AssignorName string

	// Members of the group.
	Members []ConsumerGroupDescribeResponseGroupMember

	// 32 bit bitfield representing authorized operations for the group.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupDescribeResponseGroup.
func (v *ConsumerGroupDescribeResponseGroup) Default() {
	v.AuthorizedOperations = -2147483648
}

// NewConsumerGroupDescribeResponseGroup returns a default ConsumerGroupDescribeResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupDescribeResponseGroup() ConsumerGroupDescribeResponseGroup {
	var v ConsumerGroupDescribeResponseGroup
	v.Default()
	return v
}

// ConsumerGroupDescribeResponse is returned from a ConsumerGroupDescribeRequest.
type ConsumerGroupDescribeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	Groups []ConsumerGroupDescribeResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ConsumerGroupDescribeResponse) Key() int16                 { return 69 }
func (*ConsumerGroupDescribeResponse) MaxVersion() int16          { return 1 }
func (v *ConsumerGroupDescribeResponse) SetVersion(version int16) { v.Version = version }
func (v *ConsumerGroupDescribeResponse) GetVersion() int16        { return v.Version }
func (v *ConsumerGroupDescribeResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ConsumerGroupDescribeResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ConsumerGroupDescribeResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ConsumerGroupDescribeResponse) RequestKind() Request {
	return &ConsumerGroupDescribeRequest{Version: v.Version}
}

func (v *ConsumerGroupDescribeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.State
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Epoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.AssignmentEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.AssignorName
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Members
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.MemberID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.InstanceID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.RackID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.MemberEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ClientID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.ClientHost
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.SubscribedTopics
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
					}
					{
						v := v.SubscribedTopicRegex
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := &v.Assignment
						{
							v := v.TopicPartitions
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.TopicID
									dst = kbin.AppendUuid(dst, v)
								}
								{
									v := v.Topic
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := &v.TargetAssignment
						{
							v := v.TopicPartitions
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.TopicID
									dst = kbin.AppendUuid(dst, v)
								}
								{
									v := v.Topic
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if version >= 1 {
						v := v.MemberType
						dst = kbin.AppendInt8(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ConsumerGroupDescribeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ConsumerGroupDescribeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ConsumerGroupDescribeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ConsumerGroupDescribeResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.State = v
			}
			{
				v := b.Int32()
				s.Epoch = v
			}
			{
				v := b.Int32()
				s.AssignmentEpoch = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.AssignorName = v
			}
			{
				v := s.Members
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ConsumerGroupDescribeResponseGroupMember, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.MemberID = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.InstanceID = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.RackID = v
					}
					{
						v := b.Int32()
						s.MemberEpoch = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientHost = v
					}
					{
						v := s.SubscribedTopics
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]string, l)...)
						}
						for i := int32(0); i < l; i++ {
							var v string
							if unsafe {
								if isFlexible {
									v = b.UnsafeCompactString()
								} else {
									v = b.UnsafeString()
								}
							} else {
								if isFlexible {
									v = b.CompactString()
								} else {
									v = b.String()
								}
							}
							a[i] = v
						}
						v = a
						s.SubscribedTopics = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.SubscribedTopicRegex = v
					}
					{
						v := &s.Assignment
						v.Default()
						s := v
						{
							v := s.TopicPartitions
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]AssignmentTopicPartition, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									v := b.Uuid()
									s.TopicID = v
								}
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.Topic = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.TopicPartitions = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						v := &s.TargetAssignment
						v.Default()
						s := v
						{
							v := s.TopicPartitions
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]AssignmentTopicPartition, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									v := b.Uuid()
									s.TopicID = v
								}
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.Topic = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.TopicPartitions = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					if version >= 1 {
						v := b.Int8()
						s.MemberType = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Members = v
			}
			{
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrConsumerGroupDescribeResponse returns a pointer to a default ConsumerGroupDescribeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrConsumerGroupDescribeResponse() *ConsumerGroupDescribeResponse {
	var v ConsumerGroupDescribeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ConsumerGroupDescribeResponse.
func (v *ConsumerGroupDescribeResponse) Default() {
}

// NewConsumerGroupDescribeResponse returns a default ConsumerGroupDescribeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewConsumerGroupDescribeResponse() ConsumerGroupDescribeResponse {
	var v ConsumerGroupDescribeResponse
	v.Default()
	return v
}

type ControllerRegistrationRequestListener struct {
	Name string

	Host string

	Port uint16

	SecurityProtocol int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControllerRegistrationRequestListener.
func (v *ControllerRegistrationRequestListener) Default() {
}

// NewControllerRegistrationRequestListener returns a default ControllerRegistrationRequestListener
// This is a shortcut for creating a struct and calling Default yourself.
func NewControllerRegistrationRequestListener() ControllerRegistrationRequestListener {
	var v ControllerRegistrationRequestListener
	v.Default()
	return v
}

type ControllerRegistrationRequestFeature struct {
	Name string

	MinSupportedVersion int16

	MaxSupportedVersion int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControllerRegistrationRequestFeature.
func (v *ControllerRegistrationRequestFeature) Default() {
}

// NewControllerRegistrationRequestFeature returns a default ControllerRegistrationRequestFeature
// This is a shortcut for creating a struct and calling Default yourself.
func NewControllerRegistrationRequestFeature() ControllerRegistrationRequestFeature {
	var v ControllerRegistrationRequestFeature
	v.Default()
	return v
}

// ControllerRegistrationRequest, was added for KIP-919, is what controllers
// send to the active controller to register themselves.
//
// This requires CLUSTER_ACTION on CLUSTER.
type ControllerRegistrationRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The ID of the controller to register.
	ControllerID int32

	// The controller incarnation ID, which is unique to each process run.
	IncarnationID [16]byte

	// Set if the required configurations for ZK migration are present.
	ZkMigrationReady bool

	// The listeners of this controller.
	Listeners []ControllerRegistrationRequestListener

	// The features on this controller.
	Features []ControllerRegistrationRequestFeature

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ControllerRegistrationRequest) Key() int16                 { return 70 }
func (*ControllerRegistrationRequest) MaxVersion() int16          { return 0 }
func (v *ControllerRegistrationRequest) SetVersion(version int16) { v.Version = version }
func (v *ControllerRegistrationRequest) GetVersion() int16        { return v.Version }
func (v *ControllerRegistrationRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ControllerRegistrationRequest) ResponseKind() Response {
	r := &ControllerRegistrationResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ControllerRegistrationRequest) RequestWith(ctx context.Context, r Requestor) (*ControllerRegistrationResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ControllerRegistrationResponse)
	return resp, err
}

func (v *ControllerRegistrationRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ControllerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.IncarnationID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.ZkMigrationReady
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.Listeners
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			{
				v := v.SecurityProtocol
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.Features
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.MinSupportedVersion
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.MaxSupportedVersion
				dst = kbin.AppendInt16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ControllerRegistrationRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ControllerRegistrationRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ControllerRegistrationRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ControllerID = v
	}
	{
		v := b.Uuid()
		s.IncarnationID = v
	}
	{
		v := b.Bool()
		s.ZkMigrationReady = v
	}
	{
		v := s.Listeners
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ControllerRegistrationRequestListener, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			{
				v := b.Int16()
				s.SecurityProtocol = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Listeners = v
	}
	{
		v := s.Features
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ControllerRegistrationRequestFeature, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				v := b.Int16()
				s.MinSupportedVersion = v
			}
			{
				v := b.Int16()
				s.MaxSupportedVersion = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Features = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrControllerRegistrationRequest returns a pointer to a default ControllerRegistrationRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrControllerRegistrationRequest() *ControllerRegistrationRequest {
	var v ControllerRegistrationRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControllerRegistrationRequest.
func (v *ControllerRegistrationRequest) Default() {
}

// NewControllerRegistrationRequest returns a default ControllerRegistrationRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewControllerRegistrationRequest() ControllerRegistrationRequest {
	var v ControllerRegistrationRequest
	v.Default()
	return v
}

type ControllerRegistrationResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ControllerRegistrationResponse) Key() int16                 { return 70 }
func (*ControllerRegistrationResponse) MaxVersion() int16          { return 0 }
func (v *ControllerRegistrationResponse) SetVersion(version int16) { v.Version = version }
func (v *ControllerRegistrationResponse) GetVersion() int16        { return v.Version }
func (v *ControllerRegistrationResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ControllerRegistrationResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ControllerRegistrationResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ControllerRegistrationResponse) RequestKind() Request {
	return &ControllerRegistrationRequest{Version: v.Version}
}

func (v *ControllerRegistrationResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ControllerRegistrationResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ControllerRegistrationResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ControllerRegistrationResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrControllerRegistrationResponse returns a pointer to a default ControllerRegistrationResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrControllerRegistrationResponse() *ControllerRegistrationResponse {
	var v ControllerRegistrationResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ControllerRegistrationResponse.
func (v *ControllerRegistrationResponse) Default() {
}

// NewControllerRegistrationResponse returns a default ControllerRegistrationResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewControllerRegistrationResponse() ControllerRegistrationResponse {
	var v ControllerRegistrationResponse
	v.Default()
	return v
}

// GetTelemetrySubscriptionsRequest is the initial request from the
// client asking the broker which metrics the client should send.
// This request is periodically reissued to check for updates on what
// or how the client should send. See KIP-714 for more details.
type GetTelemetrySubscriptionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Unique ID for this client instance; must be set to 0 on the first request.
	ClientInstanceID [16]byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*GetTelemetrySubscriptionsRequest) Key() int16                 { return 71 }
func (*GetTelemetrySubscriptionsRequest) MaxVersion() int16          { return 0 }
func (v *GetTelemetrySubscriptionsRequest) SetVersion(version int16) { v.Version = version }
func (v *GetTelemetrySubscriptionsRequest) GetVersion() int16        { return v.Version }
func (v *GetTelemetrySubscriptionsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *GetTelemetrySubscriptionsRequest) ResponseKind() Response {
	r := &GetTelemetrySubscriptionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *GetTelemetrySubscriptionsRequest) RequestWith(ctx context.Context, r Requestor) (*GetTelemetrySubscriptionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*GetTelemetrySubscriptionsResponse)
	return resp, err
}

func (v *GetTelemetrySubscriptionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClientInstanceID
		dst = kbin.AppendUuid(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *GetTelemetrySubscriptionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *GetTelemetrySubscriptionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *GetTelemetrySubscriptionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Uuid()
		s.ClientInstanceID = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrGetTelemetrySubscriptionsRequest returns a pointer to a default GetTelemetrySubscriptionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrGetTelemetrySubscriptionsRequest() *GetTelemetrySubscriptionsRequest {
	var v GetTelemetrySubscriptionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to GetTelemetrySubscriptionsRequest.
func (v *GetTelemetrySubscriptionsRequest) Default() {
}

// NewGetTelemetrySubscriptionsRequest returns a default GetTelemetrySubscriptionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewGetTelemetrySubscriptionsRequest() GetTelemetrySubscriptionsRequest {
	var v GetTelemetrySubscriptionsRequest
	v.Default()
	return v
}

type GetTelemetrySubscriptionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the error, if any.
	ErrorCode int16

	// Assigned client instance id if ClientInstanceID was 0 in the request, else 0.
	ClientInstanceID [16]byte

	// Unique identifier for the current subscription set for this client instance.
	SubscriptionID int32

	// Compression types that broker accepts for the PushTelemetryRequest.
	AcceptedCompressionTypes []int8

	// Configured push interval, which is the lowest configured interval in the current subscription set.
	PushIntervalMillis int32

	// The maximum bytes of binary data the broker accepts in PushTelemetryRequest.
	TelemetryMaxBytes int32

	// Flag to indicate monotonic/counter metrics are to be emitted as deltas or cumulative values.
	DeltaTemporality bool

	// Requested metrics prefix string match. Empty array: No metrics subscribed, Array[0] empty string: All metrics subscribed.
	RequestedMetrics []string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*GetTelemetrySubscriptionsResponse) Key() int16                 { return 71 }
func (*GetTelemetrySubscriptionsResponse) MaxVersion() int16          { return 0 }
func (v *GetTelemetrySubscriptionsResponse) SetVersion(version int16) { v.Version = version }
func (v *GetTelemetrySubscriptionsResponse) GetVersion() int16        { return v.Version }
func (v *GetTelemetrySubscriptionsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *GetTelemetrySubscriptionsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *GetTelemetrySubscriptionsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *GetTelemetrySubscriptionsResponse) RequestKind() Request {
	return &GetTelemetrySubscriptionsRequest{Version: v.Version}
}

func (v *GetTelemetrySubscriptionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ClientInstanceID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.SubscriptionID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.AcceptedCompressionTypes
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			dst = kbin.AppendInt8(dst, v)
		}
	}
	{
		v := v.PushIntervalMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.TelemetryMaxBytes
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.DeltaTemporality
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.RequestedMetrics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *GetTelemetrySubscriptionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *GetTelemetrySubscriptionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *GetTelemetrySubscriptionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := b.Uuid()
		s.ClientInstanceID = v
	}
	{
		v := b.Int32()
		s.SubscriptionID = v
	}
	{
		v := s.AcceptedCompressionTypes
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]int8, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := b.Int8()
			a[i] = v
		}
		v = a
		s.AcceptedCompressionTypes = v
	}
	{
		v := b.Int32()
		s.PushIntervalMillis = v
	}
	{
		v := b.Int32()
		s.TelemetryMaxBytes = v
	}
	{
		v := b.Bool()
		s.DeltaTemporality = v
	}
	{
		v := s.RequestedMetrics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.RequestedMetrics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrGetTelemetrySubscriptionsResponse returns a pointer to a default GetTelemetrySubscriptionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrGetTelemetrySubscriptionsResponse() *GetTelemetrySubscriptionsResponse {
	var v GetTelemetrySubscriptionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to GetTelemetrySubscriptionsResponse.
func (v *GetTelemetrySubscriptionsResponse) Default() {
}

// NewGetTelemetrySubscriptionsResponse returns a default GetTelemetrySubscriptionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewGetTelemetrySubscriptionsResponse() GetTelemetrySubscriptionsResponse {
	var v GetTelemetrySubscriptionsResponse
	v.Default()
	return v
}

// PushTelemetryRequest, part of KIP-714, is a client side push of metrics.
type PushTelemetryRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Unique ID for this client instance.
	ClientInstanceID [16]byte

	// The unique identifier for the current subscription.
	SubscriptionID int32

	// If the client is terminating the connection.
	Terminating bool

	// Compression codec used to compress the metrics.
	CompressionType int8

	// Metrics encoded in OpenTelemetry MetricsData v1 protobuf format.
	Metrics []byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*PushTelemetryRequest) Key() int16                 { return 72 }
func (*PushTelemetryRequest) MaxVersion() int16          { return 0 }
func (v *PushTelemetryRequest) SetVersion(version int16) { v.Version = version }
func (v *PushTelemetryRequest) GetVersion() int16        { return v.Version }
func (v *PushTelemetryRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *PushTelemetryRequest) ResponseKind() Response {
	r := &PushTelemetryResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *PushTelemetryRequest) RequestWith(ctx context.Context, r Requestor) (*PushTelemetryResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*PushTelemetryResponse)
	return resp, err
}

func (v *PushTelemetryRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClientInstanceID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.SubscriptionID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Terminating
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.CompressionType
		dst = kbin.AppendInt8(dst, v)
	}
	{
		v := v.Metrics
		if isFlexible {
			dst = kbin.AppendCompactBytes(dst, v)
		} else {
			dst = kbin.AppendBytes(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *PushTelemetryRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *PushTelemetryRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *PushTelemetryRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Uuid()
		s.ClientInstanceID = v
	}
	{
		v := b.Int32()
		s.SubscriptionID = v
	}
	{
		v := b.Bool()
		s.Terminating = v
	}
	{
		v := b.Int8()
		s.CompressionType = v
	}
	{
		var v []byte
		if isFlexible {
			v = b.CompactBytes()
		} else {
			v = b.Bytes()
		}
		s.Metrics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrPushTelemetryRequest returns a pointer to a default PushTelemetryRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrPushTelemetryRequest() *PushTelemetryRequest {
	var v PushTelemetryRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to PushTelemetryRequest.
func (v *PushTelemetryRequest) Default() {
}

// NewPushTelemetryRequest returns a default PushTelemetryRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewPushTelemetryRequest() PushTelemetryRequest {
	var v PushTelemetryRequest
	v.Default()
	return v
}

type PushTelemetryResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*PushTelemetryResponse) Key() int16                         { return 72 }
func (*PushTelemetryResponse) MaxVersion() int16                  { return 0 }
func (v *PushTelemetryResponse) SetVersion(version int16)         { v.Version = version }
func (v *PushTelemetryResponse) GetVersion() int16                { return v.Version }
func (v *PushTelemetryResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *PushTelemetryResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *PushTelemetryResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *PushTelemetryResponse) RequestKind() Request {
	return &PushTelemetryRequest{Version: v.Version}
}

func (v *PushTelemetryResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *PushTelemetryResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *PushTelemetryResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *PushTelemetryResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrPushTelemetryResponse returns a pointer to a default PushTelemetryResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrPushTelemetryResponse() *PushTelemetryResponse {
	var v PushTelemetryResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to PushTelemetryResponse.
func (v *PushTelemetryResponse) Default() {
}

// NewPushTelemetryResponse returns a default PushTelemetryResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewPushTelemetryResponse() PushTelemetryResponse {
	var v PushTelemetryResponse
	v.Default()
	return v
}

type AssignReplicasToDirsRequestDirectoryTopicPartition struct {
	// The partition index.
	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsRequestDirectoryTopicPartition.
func (v *AssignReplicasToDirsRequestDirectoryTopicPartition) Default() {
}

// NewAssignReplicasToDirsRequestDirectoryTopicPartition returns a default AssignReplicasToDirsRequestDirectoryTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsRequestDirectoryTopicPartition() AssignReplicasToDirsRequestDirectoryTopicPartition {
	var v AssignReplicasToDirsRequestDirectoryTopicPartition
	v.Default()
	return v
}

type AssignReplicasToDirsRequestDirectoryTopic struct {
	// The ID of the assigned topic.
	TopicID [16]byte

	// The partitions assigned to the directory.
	Partitions []AssignReplicasToDirsRequestDirectoryTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsRequestDirectoryTopic.
func (v *AssignReplicasToDirsRequestDirectoryTopic) Default() {
}

// NewAssignReplicasToDirsRequestDirectoryTopic returns a default AssignReplicasToDirsRequestDirectoryTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsRequestDirectoryTopic() AssignReplicasToDirsRequestDirectoryTopic {
	var v AssignReplicasToDirsRequestDirectoryTopic
	v.Default()
	return v
}

type AssignReplicasToDirsRequestDirectory struct {
	// The ID of the directory.
	ID [16]byte

	// The topics assigned to the directory.
	Topics []AssignReplicasToDirsRequestDirectoryTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsRequestDirectory.
func (v *AssignReplicasToDirsRequestDirectory) Default() {
}

// NewAssignReplicasToDirsRequestDirectory returns a default AssignReplicasToDirsRequestDirectory
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsRequestDirectory() AssignReplicasToDirsRequestDirectory {
	var v AssignReplicasToDirsRequestDirectory
	v.Default()
	return v
}

// AssignReplicasToDirs, introduced in Kafka 3.7, is a part of KIP-858.
// The KIP is about handling JBOD failures in KRaft, and this request,
// as the name implies, allows you to assign replicas to specific directories.
type AssignReplicasToDirsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The ID of the requesting broker.
	BrokerID int32

	// The epoch of the requesting broker.
	//
	// This field has a default of -1.
	BrokerEpoch int64

	// The directories to which replicas should be assigned.
	Directories []AssignReplicasToDirsRequestDirectory

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AssignReplicasToDirsRequest) Key() int16                 { return 73 }
func (*AssignReplicasToDirsRequest) MaxVersion() int16          { return 0 }
func (v *AssignReplicasToDirsRequest) SetVersion(version int16) { v.Version = version }
func (v *AssignReplicasToDirsRequest) GetVersion() int16        { return v.Version }
func (v *AssignReplicasToDirsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *AssignReplicasToDirsRequest) ResponseKind() Response {
	r := &AssignReplicasToDirsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AssignReplicasToDirsRequest) RequestWith(ctx context.Context, r Requestor) (*AssignReplicasToDirsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AssignReplicasToDirsResponse)
	return resp, err
}

func (v *AssignReplicasToDirsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.BrokerID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.BrokerEpoch
		dst = kbin.AppendInt64(dst, v)
	}
	{
		v := v.Directories
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AssignReplicasToDirsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AssignReplicasToDirsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AssignReplicasToDirsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.BrokerID = v
	}
	{
		v := b.Int64()
		s.BrokerEpoch = v
	}
	{
		v := s.Directories
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AssignReplicasToDirsRequestDirectory, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.ID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AssignReplicasToDirsRequestDirectoryTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]AssignReplicasToDirsRequestDirectoryTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Directories = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAssignReplicasToDirsRequest returns a pointer to a default AssignReplicasToDirsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAssignReplicasToDirsRequest() *AssignReplicasToDirsRequest {
	var v AssignReplicasToDirsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsRequest.
func (v *AssignReplicasToDirsRequest) Default() {
	v.BrokerEpoch = -1
}

// NewAssignReplicasToDirsRequest returns a default AssignReplicasToDirsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsRequest() AssignReplicasToDirsRequest {
	var v AssignReplicasToDirsRequest
	v.Default()
	return v
}

type AssignReplicasToDirsResponseDirectoryTopicPartition struct {
	Partition int32

	ErrorCode int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsResponseDirectoryTopicPartition.
func (v *AssignReplicasToDirsResponseDirectoryTopicPartition) Default() {
}

// NewAssignReplicasToDirsResponseDirectoryTopicPartition returns a default AssignReplicasToDirsResponseDirectoryTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsResponseDirectoryTopicPartition() AssignReplicasToDirsResponseDirectoryTopicPartition {
	var v AssignReplicasToDirsResponseDirectoryTopicPartition
	v.Default()
	return v
}

type AssignReplicasToDirsResponseDirectoryTopic struct {
	TopicID [16]byte

	Partitions []AssignReplicasToDirsResponseDirectoryTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsResponseDirectoryTopic.
func (v *AssignReplicasToDirsResponseDirectoryTopic) Default() {
}

// NewAssignReplicasToDirsResponseDirectoryTopic returns a default AssignReplicasToDirsResponseDirectoryTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsResponseDirectoryTopic() AssignReplicasToDirsResponseDirectoryTopic {
	var v AssignReplicasToDirsResponseDirectoryTopic
	v.Default()
	return v
}

type AssignReplicasToDirsResponseDirectory struct {
	ID [16]byte

	Topics []AssignReplicasToDirsResponseDirectoryTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsResponseDirectory.
func (v *AssignReplicasToDirsResponseDirectory) Default() {
}

// NewAssignReplicasToDirsResponseDirectory returns a default AssignReplicasToDirsResponseDirectory
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsResponseDirectory() AssignReplicasToDirsResponseDirectory {
	var v AssignReplicasToDirsResponseDirectory
	v.Default()
	return v
}

// AssignReplicasToDirsResponse mirrors the request fields and shape,
// with an added ErrorCode alongside each partition.
type AssignReplicasToDirsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	Directories []AssignReplicasToDirsResponseDirectory

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AssignReplicasToDirsResponse) Key() int16                 { return 73 }
func (*AssignReplicasToDirsResponse) MaxVersion() int16          { return 0 }
func (v *AssignReplicasToDirsResponse) SetVersion(version int16) { v.Version = version }
func (v *AssignReplicasToDirsResponse) GetVersion() int16        { return v.Version }
func (v *AssignReplicasToDirsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *AssignReplicasToDirsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *AssignReplicasToDirsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AssignReplicasToDirsResponse) RequestKind() Request {
	return &AssignReplicasToDirsRequest{Version: v.Version}
}

func (v *AssignReplicasToDirsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.Directories
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ErrorCode
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AssignReplicasToDirsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AssignReplicasToDirsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AssignReplicasToDirsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.Directories
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AssignReplicasToDirsResponseDirectory, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.ID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AssignReplicasToDirsResponseDirectoryTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]AssignReplicasToDirsResponseDirectoryTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int16()
								s.ErrorCode = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Directories = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAssignReplicasToDirsResponse returns a pointer to a default AssignReplicasToDirsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAssignReplicasToDirsResponse() *AssignReplicasToDirsResponse {
	var v AssignReplicasToDirsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AssignReplicasToDirsResponse.
func (v *AssignReplicasToDirsResponse) Default() {
}

// NewAssignReplicasToDirsResponse returns a default AssignReplicasToDirsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAssignReplicasToDirsResponse() AssignReplicasToDirsResponse {
	var v AssignReplicasToDirsResponse
	v.Default()
	return v
}

// ListConfigResourcesRequest, introduced in KIP-1000 and renamed
// in KIP-1142 allows you to list config resources.
//
// This was renamed from ListClientMetricsResources in Kafka 4.1.
type ListConfigResourcesRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The list of resource type. If the list is empty, it uses default supported
	// config resource types.
	ResourceTypes []int8 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListConfigResourcesRequest) Key() int16                 { return 74 }
func (*ListConfigResourcesRequest) MaxVersion() int16          { return 1 }
func (v *ListConfigResourcesRequest) SetVersion(version int16) { v.Version = version }
func (v *ListConfigResourcesRequest) GetVersion() int16        { return v.Version }
func (v *ListConfigResourcesRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListConfigResourcesRequest) ResponseKind() Response {
	r := &ListConfigResourcesResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ListConfigResourcesRequest) RequestWith(ctx context.Context, r Requestor) (*ListConfigResourcesResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ListConfigResourcesResponse)
	return resp, err
}

func (v *ListConfigResourcesRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	if version >= 1 {
		v := v.ResourceTypes
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			dst = kbin.AppendInt8(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListConfigResourcesRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListConfigResourcesRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListConfigResourcesRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	if version >= 1 {
		v := s.ResourceTypes
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]int8, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := b.Int8()
			a[i] = v
		}
		v = a
		s.ResourceTypes = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListConfigResourcesRequest returns a pointer to a default ListConfigResourcesRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListConfigResourcesRequest() *ListConfigResourcesRequest {
	var v ListConfigResourcesRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListConfigResourcesRequest.
func (v *ListConfigResourcesRequest) Default() {
}

// NewListConfigResourcesRequest returns a default ListConfigResourcesRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewListConfigResourcesRequest() ListConfigResourcesRequest {
	var v ListConfigResourcesRequest
	v.Default()
	return v
}

type ListConfigResourcesResponseConfigResource struct {
	// The resource name.
	Name string

	// The resource type.
	//
	// This field has a default of 16.
	Type int8 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListConfigResourcesResponseConfigResource.
func (v *ListConfigResourcesResponseConfigResource) Default() {
	v.Type = 16
}

// NewListConfigResourcesResponseConfigResource returns a default ListConfigResourcesResponseConfigResource
// This is a shortcut for creating a struct and calling Default yourself.
func NewListConfigResourcesResponseConfigResource() ListConfigResourcesResponseConfigResource {
	var v ListConfigResourcesResponseConfigResource
	v.Default()
	return v
}

type ListConfigResourcesResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	// Each client metrics resource in the response.
	ConfigResources []ListConfigResourcesResponseConfigResource

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ListConfigResourcesResponse) Key() int16                 { return 74 }
func (*ListConfigResourcesResponse) MaxVersion() int16          { return 1 }
func (v *ListConfigResourcesResponse) SetVersion(version int16) { v.Version = version }
func (v *ListConfigResourcesResponse) GetVersion() int16        { return v.Version }
func (v *ListConfigResourcesResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ListConfigResourcesResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ListConfigResourcesResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ListConfigResourcesResponse) RequestKind() Request {
	return &ListConfigResourcesRequest{Version: v.Version}
}

func (v *ListConfigResourcesResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ConfigResources
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if version >= 1 {
				v := v.Type
				dst = kbin.AppendInt8(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ListConfigResourcesResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ListConfigResourcesResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ListConfigResourcesResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		v := s.ConfigResources
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ListConfigResourcesResponseConfigResource, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			if version >= 1 {
				v := b.Int8()
				s.Type = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ConfigResources = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrListConfigResourcesResponse returns a pointer to a default ListConfigResourcesResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrListConfigResourcesResponse() *ListConfigResourcesResponse {
	var v ListConfigResourcesResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ListConfigResourcesResponse.
func (v *ListConfigResourcesResponse) Default() {
}

// NewListConfigResourcesResponse returns a default ListConfigResourcesResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewListConfigResourcesResponse() ListConfigResourcesResponse {
	var v ListConfigResourcesResponse
	v.Default()
	return v
}

type DescribeTopicPartitionsRequestTopic struct {
	// Topic is a topic name.
	Topic string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsRequestTopic.
func (v *DescribeTopicPartitionsRequestTopic) Default() {
}

// NewDescribeTopicPartitionsRequestTopic returns a default DescribeTopicPartitionsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsRequestTopic() DescribeTopicPartitionsRequestTopic {
	var v DescribeTopicPartitionsRequestTopic
	v.Default()
	return v
}

type DescribeTopicPartitionsRequestCursor struct {
	// Topic is the topic to start with.
	Topic string

	// Partition is the partition to start with.
	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsRequestCursor.
func (v *DescribeTopicPartitionsRequestCursor) Default() {
}

// NewDescribeTopicPartitionsRequestCursor returns a default DescribeTopicPartitionsRequestCursor
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsRequestCursor() DescribeTopicPartitionsRequestCursor {
	var v DescribeTopicPartitionsRequestCursor
	v.Default()
	return v
}

// DescribeTopicPartitionsRequest, introduced for KIP-966, allows you to fetch
// all details about a topic (particularly, eligible leader replicas).
// Note this contains more information in the response than Metadata does,
// so this request can also help avoid expensive full-cluster queries of
// topic information.
type DescribeTopicPartitionsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics to fetch details for.
	Topics []DescribeTopicPartitionsRequestTopic

	// The maximum nuber of partitions included in the response.
	//
	// This field has a default of 200.
	ResponsePartitionLimit int32

	// If non-nil, cursor is the first topic and partition to fetch details for.
	Cursor *DescribeTopicPartitionsRequestCursor

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeTopicPartitionsRequest) Key() int16                 { return 75 }
func (*DescribeTopicPartitionsRequest) MaxVersion() int16          { return 0 }
func (v *DescribeTopicPartitionsRequest) SetVersion(version int16) { v.Version = version }
func (v *DescribeTopicPartitionsRequest) GetVersion() int16        { return v.Version }
func (v *DescribeTopicPartitionsRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeTopicPartitionsRequest) ResponseKind() Response {
	r := &DescribeTopicPartitionsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeTopicPartitionsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeTopicPartitionsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeTopicPartitionsResponse)
	return resp, err
}

func (v *DescribeTopicPartitionsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ResponsePartitionLimit
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Cursor
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeTopicPartitionsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeTopicPartitionsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeTopicPartitionsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeTopicPartitionsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := b.Int32()
		s.ResponsePartitionLimit = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.Cursor = new(DescribeTopicPartitionsRequestCursor)
			v := s.Cursor
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeTopicPartitionsRequest returns a pointer to a default DescribeTopicPartitionsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeTopicPartitionsRequest() *DescribeTopicPartitionsRequest {
	var v DescribeTopicPartitionsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsRequest.
func (v *DescribeTopicPartitionsRequest) Default() {
	v.ResponsePartitionLimit = 200
	{
		v := &v.Cursor
		_ = v
	}
}

// NewDescribeTopicPartitionsRequest returns a default DescribeTopicPartitionsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsRequest() DescribeTopicPartitionsRequest {
	var v DescribeTopicPartitionsRequest
	v.Default()
	return v
}

type DescribeTopicPartitionsResponseTopicPartition struct {
	// The partition error, or 0 if there is no error.
	ErrorCode int16

	// The partition this is a response for.
	Partition int32

	// The ID of the leader broker for this partition.
	LeaderID int32

	// The leader epoch of this partition.
	//
	// This field has a default of -1.
	LeaderEpoch int32

	// The set of all nodes that host this partition.
	Replicas []int32

	// The set of all nodes that are in sync with the leader for this partition.
	ISR []int32

	// The eligible leader replicas for this partition.
	EligibleLeaderReplicas []int32

	// The last known eligible leader replicas.
	LastKnownELR []int32

	// The set of offline replicas for this partition.
	OfflineReplicas []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsResponseTopicPartition.
func (v *DescribeTopicPartitionsResponseTopicPartition) Default() {
	v.LeaderEpoch = -1
}

// NewDescribeTopicPartitionsResponseTopicPartition returns a default DescribeTopicPartitionsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsResponseTopicPartition() DescribeTopicPartitionsResponseTopicPartition {
	var v DescribeTopicPartitionsResponseTopicPartition
	v.Default()
	return v
}

type DescribeTopicPartitionsResponseTopic struct {
	// The topic error, or 0 if there is no error.
	ErrorCode int16

	// The topic name.
	Topic *string

	// The topic ID.
	TopicID [16]byte

	// True if the topic is internal.
	IsInternal bool

	Partitions []DescribeTopicPartitionsResponseTopicPartition

	// 32-bit bitfield representing authorized operations for this topic.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsResponseTopic.
func (v *DescribeTopicPartitionsResponseTopic) Default() {
	v.AuthorizedOperations = -2147483648
}

// NewDescribeTopicPartitionsResponseTopic returns a default DescribeTopicPartitionsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsResponseTopic() DescribeTopicPartitionsResponseTopic {
	var v DescribeTopicPartitionsResponseTopic
	v.Default()
	return v
}

type DescribeTopicPartitionsResponseNextCursor struct {
	// Topic is the topic to start with.
	Topic string

	// Partition is the partition to start with.
	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsResponseNextCursor.
func (v *DescribeTopicPartitionsResponseNextCursor) Default() {
}

// NewDescribeTopicPartitionsResponseNextCursor returns a default DescribeTopicPartitionsResponseNextCursor
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsResponseNextCursor() DescribeTopicPartitionsResponseNextCursor {
	var v DescribeTopicPartitionsResponseNextCursor
	v.Default()
	return v
}

type DescribeTopicPartitionsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Each topic in the response.
	Topics []DescribeTopicPartitionsResponseTopic

	// The cursor to use in the next request to iterate through topic/partition details.
	NextCursor *DescribeTopicPartitionsResponseNextCursor

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeTopicPartitionsResponse) Key() int16                 { return 75 }
func (*DescribeTopicPartitionsResponse) MaxVersion() int16          { return 0 }
func (v *DescribeTopicPartitionsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeTopicPartitionsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeTopicPartitionsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeTopicPartitionsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DescribeTopicPartitionsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeTopicPartitionsResponse) RequestKind() Request {
	return &DescribeTopicPartitionsRequest{Version: v.Version}
}

func (v *DescribeTopicPartitionsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.IsInternal
				dst = kbin.AppendBool(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Replicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.ISR
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.EligibleLeaderReplicas
						if isFlexible {
							dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
						} else {
							dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.LastKnownELR
						if isFlexible {
							dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
						} else {
							dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					{
						v := v.OfflineReplicas
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.NextCursor
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeTopicPartitionsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeTopicPartitionsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeTopicPartitionsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeTopicPartitionsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Topic = v
			}
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := b.Bool()
				s.IsInternal = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeTopicPartitionsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderID = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := s.Replicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Replicas = v
					}
					{
						v := s.ISR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.ISR = v
					}
					{
						v := s.EligibleLeaderReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if version < 0 || l == 0 {
							a = []int32{}
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.EligibleLeaderReplicas = v
					}
					{
						v := s.LastKnownELR
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if version < 0 || l == 0 {
							a = []int32{}
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.LastKnownELR = v
					}
					{
						v := s.OfflineReplicas
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.OfflineReplicas = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			{
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.NextCursor = new(DescribeTopicPartitionsResponseNextCursor)
			v := s.NextCursor
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeTopicPartitionsResponse returns a pointer to a default DescribeTopicPartitionsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeTopicPartitionsResponse() *DescribeTopicPartitionsResponse {
	var v DescribeTopicPartitionsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeTopicPartitionsResponse.
func (v *DescribeTopicPartitionsResponse) Default() {
	{
		v := &v.NextCursor
		_ = v
	}
}

// NewDescribeTopicPartitionsResponse returns a default DescribeTopicPartitionsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeTopicPartitionsResponse() DescribeTopicPartitionsResponse {
	var v DescribeTopicPartitionsResponse
	v.Default()
	return v
}

// ShareGroupHeartbeatRequest is a request for share groups.
type ShareGroupHeartbeatRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group ID.
	GroupID string

	// MemberID is generated by the consumer. The member id must be kept during
	// the entire lifetime of the consumer process.
	MemberID string

	// MemberEpoch is the current member epoch; 0 to join the group; -1 to leave
	// the group.
	MemberEpoch int32

	// RackID is the rack ID; null if not provided or unchanging since the last
	// heartbeat.
	RackID *string

	// SubscribedTopicNames are the subscribed topics; null if unchanging since
	// the last heartbeat.
	SubscribedTopicNames []string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareGroupHeartbeatRequest) Key() int16                   { return 76 }
func (*ShareGroupHeartbeatRequest) MaxVersion() int16            { return 1 }
func (v *ShareGroupHeartbeatRequest) SetVersion(version int16)   { v.Version = version }
func (v *ShareGroupHeartbeatRequest) GetVersion() int16          { return v.Version }
func (v *ShareGroupHeartbeatRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *ShareGroupHeartbeatRequest) IsGroupCoordinatorRequest() {}
func (v *ShareGroupHeartbeatRequest) ResponseKind() Response {
	r := &ShareGroupHeartbeatResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ShareGroupHeartbeatRequest) RequestWith(ctx context.Context, r Requestor) (*ShareGroupHeartbeatResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ShareGroupHeartbeatResponse)
	return resp, err
}

func (v *ShareGroupHeartbeatRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.RackID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.SubscribedTopicNames
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareGroupHeartbeatRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareGroupHeartbeatRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareGroupHeartbeatRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.RackID = v
	}
	{
		v := s.SubscribedTopicNames
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []string{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.SubscribedTopicNames = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareGroupHeartbeatRequest returns a pointer to a default ShareGroupHeartbeatRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareGroupHeartbeatRequest() *ShareGroupHeartbeatRequest {
	var v ShareGroupHeartbeatRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupHeartbeatRequest.
func (v *ShareGroupHeartbeatRequest) Default() {
}

// NewShareGroupHeartbeatRequest returns a default ShareGroupHeartbeatRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupHeartbeatRequest() ShareGroupHeartbeatRequest {
	var v ShareGroupHeartbeatRequest
	v.Default()
	return v
}

type ShareGroupHeartbeatResponseAssignmentTopicPartition struct {
	TopicID [16]byte

	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupHeartbeatResponseAssignmentTopicPartition.
func (v *ShareGroupHeartbeatResponseAssignmentTopicPartition) Default() {
}

// NewShareGroupHeartbeatResponseAssignmentTopicPartition returns a default ShareGroupHeartbeatResponseAssignmentTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupHeartbeatResponseAssignmentTopicPartition() ShareGroupHeartbeatResponseAssignmentTopicPartition {
	var v ShareGroupHeartbeatResponseAssignmentTopicPartition
	v.Default()
	return v
}

type ShareGroupHeartbeatResponseAssignment struct {
	// TopicPartitions contains the partitions assigned to the member.
	TopicPartitions []ShareGroupHeartbeatResponseAssignmentTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupHeartbeatResponseAssignment.
func (v *ShareGroupHeartbeatResponseAssignment) Default() {
}

// NewShareGroupHeartbeatResponseAssignment returns a default ShareGroupHeartbeatResponseAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupHeartbeatResponseAssignment() ShareGroupHeartbeatResponseAssignment {
	var v ShareGroupHeartbeatResponseAssignment
	v.Default()
	return v
}

// ShareGroupHeartbeatResponse is a response for a ShareGroupHeartbeatRequest.
//
// Version 0 was used for early access of KIP-932 in Apache Kafka 4.0 but
// removed in Apacke Kafka 4.1.
//
// Version 1 is the initial stable version (KIP-932).
type ShareGroupHeartbeatResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is any error for the response.
	//
	// Supported errors:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - TOPIC_AUTHORIZATION_FAILED (version 1+)
	// - NOT_COORDINATOR (version 0+)
	// - COORDINATOR_NOT_AVAILABLE (version 0+)
	// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
	// - UNKNOWN_MEMBER_ID (version 0+)
	// - GROUP_MAX_SIZE_REACHED (version 0+)
	// - INVALID_REQUEST (version 0+)
	ErrorCode int16

	// ErrorMessage is an optional message if there is an error.
	ErrorMessage *string

	// MemberID is the ID generated by the consumer and provided by the consumer
	// for all requests.
	MemberID *string

	// MemberEpoch is the member epoch.
	MemberEpoch int32

	// HeartbeatIntervalMillis is the heartbeat interval in milliseconds.
	HeartbeatIntervalMillis int32

	// Assignment is the assignment, if provided.
	Assignment *ShareGroupHeartbeatResponseAssignment

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareGroupHeartbeatResponse) Key() int16                 { return 76 }
func (*ShareGroupHeartbeatResponse) MaxVersion() int16          { return 1 }
func (v *ShareGroupHeartbeatResponse) SetVersion(version int16) { v.Version = version }
func (v *ShareGroupHeartbeatResponse) GetVersion() int16        { return v.Version }
func (v *ShareGroupHeartbeatResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ShareGroupHeartbeatResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ShareGroupHeartbeatResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ShareGroupHeartbeatResponse) RequestKind() Request {
	return &ShareGroupHeartbeatRequest{Version: v.Version}
}

func (v *ShareGroupHeartbeatResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.HeartbeatIntervalMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Assignment
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.TopicPartitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareGroupHeartbeatResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareGroupHeartbeatResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareGroupHeartbeatResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		v := b.Int32()
		s.HeartbeatIntervalMillis = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.Assignment = new(ShareGroupHeartbeatResponseAssignment)
			v := s.Assignment
			v.Default()
			s := v
			{
				v := s.TopicPartitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareGroupHeartbeatResponseAssignmentTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.TopicPartitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareGroupHeartbeatResponse returns a pointer to a default ShareGroupHeartbeatResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareGroupHeartbeatResponse() *ShareGroupHeartbeatResponse {
	var v ShareGroupHeartbeatResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupHeartbeatResponse.
func (v *ShareGroupHeartbeatResponse) Default() {
	{
		v := &v.Assignment
		_ = v
	}
}

// NewShareGroupHeartbeatResponse returns a default ShareGroupHeartbeatResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupHeartbeatResponse() ShareGroupHeartbeatResponse {
	var v ShareGroupHeartbeatResponse
	v.Default()
	return v
}

// ShareGroupDescribeRequest is a request to describe share groups.
//
// Version 0 was used for early access of KIP-932 in Apache Kafka 4.0 but
// removed in Apacke Kafka 4.1.
//
// Version 1 is the initial stable version (KIP-932).
type ShareGroupDescribeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupIDs are the IDs of the groups to describe.
	GroupIDs []string

	// IncludeAuthorizedOperations is whether to include authorized operations.
	IncludeAuthorizedOperations bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareGroupDescribeRequest) Key() int16                   { return 77 }
func (*ShareGroupDescribeRequest) MaxVersion() int16            { return 1 }
func (v *ShareGroupDescribeRequest) SetVersion(version int16)   { v.Version = version }
func (v *ShareGroupDescribeRequest) GetVersion() int16          { return v.Version }
func (v *ShareGroupDescribeRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *ShareGroupDescribeRequest) IsGroupCoordinatorRequest() {}
func (v *ShareGroupDescribeRequest) ResponseKind() Response {
	r := &ShareGroupDescribeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ShareGroupDescribeRequest) RequestWith(ctx context.Context, r Requestor) (*ShareGroupDescribeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ShareGroupDescribeResponse)
	return resp, err
}

func (v *ShareGroupDescribeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupIDs
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	{
		v := v.IncludeAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareGroupDescribeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareGroupDescribeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareGroupDescribeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.GroupIDs
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.GroupIDs = v
	}
	{
		v := b.Bool()
		s.IncludeAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareGroupDescribeRequest returns a pointer to a default ShareGroupDescribeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareGroupDescribeRequest() *ShareGroupDescribeRequest {
	var v ShareGroupDescribeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeRequest.
func (v *ShareGroupDescribeRequest) Default() {
}

// NewShareGroupDescribeRequest returns a default ShareGroupDescribeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeRequest() ShareGroupDescribeRequest {
	var v ShareGroupDescribeRequest
	v.Default()
	return v
}

type ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition struct {
	// TopicID is the topic ID.
	TopicID [16]byte

	// Topic is the topic name.
	Topic string

	// Partitions are the partitions.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition.
func (v *ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition) Default() {
}

// NewShareGroupDescribeResponseGroupMemberAssignmentTopicPartition returns a default ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeResponseGroupMemberAssignmentTopicPartition() ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition {
	var v ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition
	v.Default()
	return v
}

type ShareGroupDescribeResponseGroupMemberAssignment struct {
	// TopicPartitions are the assigned topic-partitions to the member.
	TopicPartitions []ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeResponseGroupMemberAssignment.
func (v *ShareGroupDescribeResponseGroupMemberAssignment) Default() {
}

// NewShareGroupDescribeResponseGroupMemberAssignment returns a default ShareGroupDescribeResponseGroupMemberAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeResponseGroupMemberAssignment() ShareGroupDescribeResponseGroupMemberAssignment {
	var v ShareGroupDescribeResponseGroupMemberAssignment
	v.Default()
	return v
}

type ShareGroupDescribeResponseGroupMember struct {
	// MemberID is the member ID.
	MemberID string

	// RackID is the member rack ID.
	RackID *string

	// MemberEpoch is the current member epoch.
	MemberEpoch int32

	// ClientID is the client ID.
	ClientID string

	// ClientHost is the client host.
	ClientHost string

	// SubscribedTopicNames are the subscribed topic names.
	SubscribedTopicNames []string

	// Assignment is the current assignment.
	Assignment ShareGroupDescribeResponseGroupMemberAssignment

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeResponseGroupMember.
func (v *ShareGroupDescribeResponseGroupMember) Default() {
	{
		v := &v.Assignment
		_ = v
	}
}

// NewShareGroupDescribeResponseGroupMember returns a default ShareGroupDescribeResponseGroupMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeResponseGroupMember() ShareGroupDescribeResponseGroupMember {
	var v ShareGroupDescribeResponseGroupMember
	v.Default()
	return v
}

type ShareGroupDescribeResponseGroup struct {
	// ErrorCode is the describe error, or 0 if there was no error.
	//
	// Supported errors:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - TOPIC_AUTHORIZATION_FAILED (version 1+)
	// - NOT_COORDINATOR (version 0+)
	// - COORDINATOR_NOT_AVAILABLE (version 0+)
	// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
	// - INVALID_GROUP_ID (version 0+)
	// - GROUP_ID_NOT_FOUND (version 0+)
	// - INVALID_REQUEST (version 0+)
	ErrorCode int16

	// ErrorMessage is an optional message if there is an error.
	ErrorMessage *string

	// GroupID is the group ID string.
	GroupID string

	// GroupState is the group state string, or the empty string.
	GroupState string

	// GroupEpoch is the group epoch.
	GroupEpoch int32

	// AssignmentEpoch is the assignment epoch.
	AssignmentEpoch int32

	// Assignor is the selected assignor.
	Assignor string

	// Members are the members.
	Members []ShareGroupDescribeResponseGroupMember

	// AuthorizedOperations is a 32-bit bitfield to represent authorized
	// operations for this group.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeResponseGroup.
func (v *ShareGroupDescribeResponseGroup) Default() {
	v.AuthorizedOperations = -2147483648
}

// NewShareGroupDescribeResponseGroup returns a default ShareGroupDescribeResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeResponseGroup() ShareGroupDescribeResponseGroup {
	var v ShareGroupDescribeResponseGroup
	v.Default()
	return v
}

// ShareGroupDescribeResponse is a response for a ShareGroupDescribeRequest.
type ShareGroupDescribeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Groups contains each described group.
	Groups []ShareGroupDescribeResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareGroupDescribeResponse) Key() int16                 { return 77 }
func (*ShareGroupDescribeResponse) MaxVersion() int16          { return 1 }
func (v *ShareGroupDescribeResponse) SetVersion(version int16) { v.Version = version }
func (v *ShareGroupDescribeResponse) GetVersion() int16        { return v.Version }
func (v *ShareGroupDescribeResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ShareGroupDescribeResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *ShareGroupDescribeResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ShareGroupDescribeResponse) RequestKind() Request {
	return &ShareGroupDescribeRequest{Version: v.Version}
}

func (v *ShareGroupDescribeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.GroupID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.GroupState
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.GroupEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.AssignmentEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Assignor
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Members
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.MemberID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.RackID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.MemberEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ClientID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.ClientHost
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.SubscribedTopicNames
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
					}
					{
						v := &v.Assignment
						{
							v := v.TopicPartitions
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.TopicID
									dst = kbin.AppendUuid(dst, v)
								}
								{
									v := v.Topic
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareGroupDescribeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareGroupDescribeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareGroupDescribeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareGroupDescribeResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupState = v
			}
			{
				v := b.Int32()
				s.GroupEpoch = v
			}
			{
				v := b.Int32()
				s.AssignmentEpoch = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Assignor = v
			}
			{
				v := s.Members
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareGroupDescribeResponseGroupMember, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.MemberID = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.RackID = v
					}
					{
						v := b.Int32()
						s.MemberEpoch = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientHost = v
					}
					{
						v := s.SubscribedTopicNames
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]string, l)...)
						}
						for i := int32(0); i < l; i++ {
							var v string
							if unsafe {
								if isFlexible {
									v = b.UnsafeCompactString()
								} else {
									v = b.UnsafeString()
								}
							} else {
								if isFlexible {
									v = b.CompactString()
								} else {
									v = b.String()
								}
							}
							a[i] = v
						}
						v = a
						s.SubscribedTopicNames = v
					}
					{
						v := &s.Assignment
						v.Default()
						s := v
						{
							v := s.TopicPartitions
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]ShareGroupDescribeResponseGroupMemberAssignmentTopicPartition, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									v := b.Uuid()
									s.TopicID = v
								}
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.Topic = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.TopicPartitions = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Members = v
			}
			{
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareGroupDescribeResponse returns a pointer to a default ShareGroupDescribeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareGroupDescribeResponse() *ShareGroupDescribeResponse {
	var v ShareGroupDescribeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareGroupDescribeResponse.
func (v *ShareGroupDescribeResponse) Default() {
}

// NewShareGroupDescribeResponse returns a default ShareGroupDescribeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareGroupDescribeResponse() ShareGroupDescribeResponse {
	var v ShareGroupDescribeResponse
	v.Default()
	return v
}

type ShareFetchRequestTopicPartitionAcknowledgementBatch struct {
	// FirstOffset is the first offset of batch of records to acknowledge.
	FirstOffset int64

	// LastOffset is the last offset (inclusive) of batch of records to
	// acknowledge.
	LastOffset int64

	// AcknowledgeTypes is an array of acknowledge types -
	// 0:Gap,1:Accept,2:Release,3:Reject.
	AcknowledgeTypes []int8

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchRequestTopicPartitionAcknowledgementBatch.
func (v *ShareFetchRequestTopicPartitionAcknowledgementBatch) Default() {
}

// NewShareFetchRequestTopicPartitionAcknowledgementBatch returns a default ShareFetchRequestTopicPartitionAcknowledgementBatch
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchRequestTopicPartitionAcknowledgementBatch() ShareFetchRequestTopicPartitionAcknowledgementBatch {
	var v ShareFetchRequestTopicPartitionAcknowledgementBatch
	v.Default()
	return v
}

type ShareFetchRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// PartitionMaxBytes is the maximum bytes to fetch from this partition.
	// 0 when only acknowledgement with no fetching is required. See KIP-74
	// for cases where this limit may not be honored.
	PartitionMaxBytes int32

	// AcknowledgementBatches are record batches to acknowledge.
	AcknowledgementBatches []ShareFetchRequestTopicPartitionAcknowledgementBatch

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchRequestTopicPartition.
func (v *ShareFetchRequestTopicPartition) Default() {
}

// NewShareFetchRequestTopicPartition returns a default ShareFetchRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchRequestTopicPartition() ShareFetchRequestTopicPartition {
	var v ShareFetchRequestTopicPartition
	v.Default()
	return v
}

type ShareFetchRequestTopic struct {
	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the partitions to fetch.
	Partitions []ShareFetchRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchRequestTopic.
func (v *ShareFetchRequestTopic) Default() {
}

// NewShareFetchRequestTopic returns a default ShareFetchRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchRequestTopic() ShareFetchRequestTopic {
	var v ShareFetchRequestTopic
	v.Default()
	return v
}

type ShareFetchRequestForgottenTopicsData struct {
	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the partitions indexes to forget.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchRequestForgottenTopicsData.
func (v *ShareFetchRequestForgottenTopicsData) Default() {
}

// NewShareFetchRequestForgottenTopicsData returns a default ShareFetchRequestForgottenTopicsData
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchRequestForgottenTopicsData() ShareFetchRequestForgottenTopicsData {
	var v ShareFetchRequestForgottenTopicsData
	v.Default()
	return v
}

// ShareFetchRequest is a request to fetch records from share groups.
//
// Version 0 was used for early access of KIP-932 in Apache Kafka 4.0 but
// removed in Apacke Kafka 4.1.
//
// Version 1 is the initial stable version (KIP-932).
//
// Version 2, introduced in Kafka 4.2, adds ShareAcquireMode (KIP-1206) and
// IsRenewAck for renew acknowledgements (KIP-1222).
type ShareFetchRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID *string

	// MemberID is the member ID.
	MemberID *string

	// ShareSessionEpoch is the current share session epoch: 0 to open a share
	// session; -1 to close it; otherwise increments for consecutive requests.
	ShareSessionEpoch int32

	// MaxWaitMillis is the maximum time in milliseconds to wait for the
	// response.
	MaxWaitMillis int32

	// MinBytes is the minimum bytes to accumulate in the response.
	MinBytes int32

	// MaxBytes is the maximum bytes to fetch. See KIP-74 for cases where this
	// limit may not be honored.
	//
	// This field has a default of 0x7fffffff.
	MaxBytes int32

	// MaxRecords is the maximum number of records to fetch. This limit can be
	// exceeded for alignment of batch boundaries.
	MaxRecords int32 // v1+

	// BatchSize is the optimal number of records for batches of acquired
	// records and acknowledgements.
	BatchSize int32 // v1+

	// ShareAcquireMode controls the fetch behavior:
	// 0 = batch-optimized, 1 = record-limit.
	ShareAcquireMode int8 // v2+

	// IsRenewAck indicates whether Renew type acknowledgements are present
	// in AcknowledgementBatches.
	IsRenewAck bool // v2+

	// Topics are the topics to fetch.
	Topics []ShareFetchRequestTopic

	// ForgottenTopicsData are the partitions to remove from this share session.
	ForgottenTopicsData []ShareFetchRequestForgottenTopicsData

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareFetchRequest) Key() int16                 { return 78 }
func (*ShareFetchRequest) MaxVersion() int16          { return 2 }
func (v *ShareFetchRequest) SetVersion(version int16) { v.Version = version }
func (v *ShareFetchRequest) GetVersion() int16        { return v.Version }
func (v *ShareFetchRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ShareFetchRequest) ResponseKind() Response {
	r := &ShareFetchResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ShareFetchRequest) RequestWith(ctx context.Context, r Requestor) (*ShareFetchResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ShareFetchResponse)
	return resp, err
}

func (v *ShareFetchRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.ShareSessionEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MaxWaitMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MinBytes
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.MaxBytes
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.MaxRecords
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 1 {
		v := v.BatchSize
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 2 {
		v := v.ShareAcquireMode
		dst = kbin.AppendInt8(dst, v)
	}
	if version >= 2 {
		v := v.IsRenewAck
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if version >= 0 && version <= 0 {
						v := v.PartitionMaxBytes
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.AcknowledgementBatches
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LastOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.AcknowledgeTypes
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									dst = kbin.AppendInt8(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ForgottenTopicsData
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareFetchRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareFetchRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareFetchRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.GroupID = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.ShareSessionEpoch = v
	}
	{
		v := b.Int32()
		s.MaxWaitMillis = v
	}
	{
		v := b.Int32()
		s.MinBytes = v
	}
	{
		v := b.Int32()
		s.MaxBytes = v
	}
	if version >= 1 {
		v := b.Int32()
		s.MaxRecords = v
	}
	if version >= 1 {
		v := b.Int32()
		s.BatchSize = v
	}
	if version >= 2 {
		v := b.Int8()
		s.ShareAcquireMode = v
	}
	if version >= 2 {
		v := b.Bool()
		s.IsRenewAck = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareFetchRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareFetchRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if version >= 0 && version <= 0 {
						v := b.Int32()
						s.PartitionMaxBytes = v
					}
					{
						v := s.AcknowledgementBatches
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]ShareFetchRequestTopicPartitionAcknowledgementBatch, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							{
								v := b.Int64()
								s.LastOffset = v
							}
							{
								v := s.AcknowledgeTypes
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]int8, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := b.Int8()
									a[i] = v
								}
								v = a
								s.AcknowledgeTypes = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.AcknowledgementBatches = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := s.ForgottenTopicsData
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareFetchRequestForgottenTopicsData, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ForgottenTopicsData = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareFetchRequest returns a pointer to a default ShareFetchRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareFetchRequest() *ShareFetchRequest {
	var v ShareFetchRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchRequest.
func (v *ShareFetchRequest) Default() {
	v.MaxBytes = 2147483647
}

// NewShareFetchRequest returns a default ShareFetchRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchRequest() ShareFetchRequest {
	var v ShareFetchRequest
	v.Default()
	return v
}

type ShareFetchResponseTopicPartitionCurrentLeader struct {
	// LeaderID is the ID of the current leader or -1 if the leader is
	// unknown.
	LeaderID int32

	// LeaderEpoch is the latest known leader epoch.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponseTopicPartitionCurrentLeader.
func (v *ShareFetchResponseTopicPartitionCurrentLeader) Default() {
}

// NewShareFetchResponseTopicPartitionCurrentLeader returns a default ShareFetchResponseTopicPartitionCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponseTopicPartitionCurrentLeader() ShareFetchResponseTopicPartitionCurrentLeader {
	var v ShareFetchResponseTopicPartitionCurrentLeader
	v.Default()
	return v
}

type ShareFetchResponseTopicPartitionAcquiredRecord struct {
	// FirstOffset is the earliest offset in this batch of acquired
	// records.
	FirstOffset int64

	// LastOffset is the last offset of this batch of acquired records.
	LastOffset int64

	// DeliveryCount is the delivery count of this batch of acquired
	// records.
	DeliveryCount int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponseTopicPartitionAcquiredRecord.
func (v *ShareFetchResponseTopicPartitionAcquiredRecord) Default() {
}

// NewShareFetchResponseTopicPartitionAcquiredRecord returns a default ShareFetchResponseTopicPartitionAcquiredRecord
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponseTopicPartitionAcquiredRecord() ShareFetchResponseTopicPartitionAcquiredRecord {
	var v ShareFetchResponseTopicPartitionAcquiredRecord
	v.Default()
	return v
}

type ShareFetchResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the fetch error code, or 0 if there was no fetch error.
	ErrorCode int16

	// ErrorMessage is the fetch error message, or null if there was no
	// fetch error.
	ErrorMessage *string

	// AcknowledgeErrorCode is the acknowledge error code, or 0 if there was
	// no acknowledge error.
	AcknowledgeErrorCode int16

	// AcknowledgeErrorMessage is the acknowledge error message, or null if
	// there was no acknowledge error.
	AcknowledgeErrorMessage *string

	// CurrentLeader is the current leader of the partition.
	CurrentLeader ShareFetchResponseTopicPartitionCurrentLeader

	// Records is the record data.
	Records []byte

	// AcquiredRecords are the acquired records.
	AcquiredRecords []ShareFetchResponseTopicPartitionAcquiredRecord

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponseTopicPartition.
func (v *ShareFetchResponseTopicPartition) Default() {
	{
		v := &v.CurrentLeader
		_ = v
	}
}

// NewShareFetchResponseTopicPartition returns a default ShareFetchResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponseTopicPartition() ShareFetchResponseTopicPartition {
	var v ShareFetchResponseTopicPartition
	v.Default()
	return v
}

type ShareFetchResponseTopic struct {
	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the topic partitions.
	Partitions []ShareFetchResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponseTopic.
func (v *ShareFetchResponseTopic) Default() {
}

// NewShareFetchResponseTopic returns a default ShareFetchResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponseTopic() ShareFetchResponseTopic {
	var v ShareFetchResponseTopic
	v.Default()
	return v
}

type ShareFetchResponseNodeEndpoint struct {
	// NodeID is the ID of the associated node.
	NodeID int32

	// Host is the node's hostname.
	Host string

	// Port is the node's port.
	Port int32

	// Rack is the rack of the node, or null if it has not been assigned to a
	// rack.
	Rack *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponseNodeEndpoint.
func (v *ShareFetchResponseNodeEndpoint) Default() {
}

// NewShareFetchResponseNodeEndpoint returns a default ShareFetchResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponseNodeEndpoint() ShareFetchResponseNodeEndpoint {
	var v ShareFetchResponseNodeEndpoint
	v.Default()
	return v
}

// ShareFetchResponse is a response for a ShareFetchRequest.
type ShareFetchResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the top-level response error code.
	//
	// Supported errors for ErrorCode and AcknowledgeErrorCode:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - TOPIC_AUTHORIZATION_FAILED (version 0+)
	// - SHARE_SESSION_NOT_FOUND (version 0+)
	// - INVALID_SHARE_SESSION_EPOCH (version 0+)
	// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
	// - NOT_LEADER_OR_FOLLOWER (version 0+)
	// - UNKNOWN_TOPIC_ID (version 0+)
	// - INVALID_RECORD_STATE (version 0+) - only for AcknowledgeErrorCode
	// - KAFKA_STORAGE_ERROR (version 0+)
	// - CORRUPT_MESSAGE (version 0+)
	// - INVALID_REQUEST (version 0+)
	// - UNKNOWN_SERVER_ERROR (version 0+)
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// AcquisitionLockTimeoutMillis is the time in milliseconds for which the
	// acquired records are locked.
	AcquisitionLockTimeoutMillis int32 // v1+

	// Topics are the response topics.
	Topics []ShareFetchResponseTopic

	// NodeEndpoints are endpoints for all current leaders enumerated in
	// PartitionData with error NOT_LEADER_OR_FOLLOWER.
	NodeEndpoints []ShareFetchResponseNodeEndpoint

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareFetchResponse) Key() int16                         { return 78 }
func (*ShareFetchResponse) MaxVersion() int16                  { return 2 }
func (v *ShareFetchResponse) SetVersion(version int16)         { v.Version = version }
func (v *ShareFetchResponse) GetVersion() int16                { return v.Version }
func (v *ShareFetchResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *ShareFetchResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *ShareFetchResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *ShareFetchResponse) RequestKind() Request             { return &ShareFetchRequest{Version: v.Version} }

func (v *ShareFetchResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 1 {
		v := v.AcquisitionLockTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.AcknowledgeErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.AcknowledgeErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := &v.CurrentLeader
						{
							v := v.LeaderID
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.LeaderEpoch
							dst = kbin.AppendInt32(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := v.Records
						if isFlexible {
							dst = kbin.AppendCompactNullableBytes(dst, v)
						} else {
							dst = kbin.AppendNullableBytes(dst, v)
						}
					}
					{
						v := v.AcquiredRecords
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LastOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.DeliveryCount
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.NodeEndpoints
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Rack
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareFetchResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareFetchResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareFetchResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if version >= 1 {
		v := b.Int32()
		s.AcquisitionLockTimeoutMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareFetchResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareFetchResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := b.Int16()
						s.AcknowledgeErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.AcknowledgeErrorMessage = v
					}
					{
						v := &s.CurrentLeader
						v.Default()
						s := v
						{
							v := b.Int32()
							s.LeaderID = v
						}
						{
							v := b.Int32()
							s.LeaderEpoch = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						var v []byte
						if isFlexible {
							v = b.CompactNullableBytes()
						} else {
							v = b.NullableBytes()
						}
						s.Records = v
					}
					{
						v := s.AcquiredRecords
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]ShareFetchResponseTopicPartitionAcquiredRecord, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							{
								v := b.Int64()
								s.LastOffset = v
							}
							{
								v := b.Int16()
								s.DeliveryCount = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.AcquiredRecords = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := s.NodeEndpoints
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareFetchResponseNodeEndpoint, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Rack = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.NodeEndpoints = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareFetchResponse returns a pointer to a default ShareFetchResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareFetchResponse() *ShareFetchResponse {
	var v ShareFetchResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareFetchResponse.
func (v *ShareFetchResponse) Default() {
}

// NewShareFetchResponse returns a default ShareFetchResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareFetchResponse() ShareFetchResponse {
	var v ShareFetchResponse
	v.Default()
	return v
}

type ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch struct {
	// FirstOffset is the first offset of batch of records to acknowledge.
	FirstOffset int64

	// LastOffset is the last offset (inclusive) of batch of records to
	// acknowledge.
	LastOffset int64

	// AcknowledgeTypes is an array of acknowledge types -
	// 0:Gap,1:Accept,2:Release,3:Reject.
	AcknowledgeTypes []int8

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch.
func (v *ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch) Default() {
}

// NewShareAcknowledgeRequestTopicPartitionAcknowledgementBatch returns a default ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeRequestTopicPartitionAcknowledgementBatch() ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch {
	var v ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch
	v.Default()
	return v
}

type ShareAcknowledgeRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// AcknowledgementBatches are record batches to acknowledge.
	AcknowledgementBatches []ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeRequestTopicPartition.
func (v *ShareAcknowledgeRequestTopicPartition) Default() {
}

// NewShareAcknowledgeRequestTopicPartition returns a default ShareAcknowledgeRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeRequestTopicPartition() ShareAcknowledgeRequestTopicPartition {
	var v ShareAcknowledgeRequestTopicPartition
	v.Default()
	return v
}

type ShareAcknowledgeRequestTopic struct {
	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the partitions containing records to acknowledge.
	Partitions []ShareAcknowledgeRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeRequestTopic.
func (v *ShareAcknowledgeRequestTopic) Default() {
}

// NewShareAcknowledgeRequestTopic returns a default ShareAcknowledgeRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeRequestTopic() ShareAcknowledgeRequestTopic {
	var v ShareAcknowledgeRequestTopic
	v.Default()
	return v
}

// ShareAcknowledgeRequest is a request to acknowledge records in share groups.
//
// Version 0 was used for early access of KIP-932 in Apache Kafka 4.0 but
// removed in Apacke Kafka 4.1.
//
// Version 1 is the initial stable version (KIP-932).
//
// Version 2, introduced in Kafka 4.2, adds IsRenewAck (KIP-1222) and
// AcquisitionLockTimeoutMillis in the response.
type ShareAcknowledgeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID *string

	// MemberID is the member ID.
	MemberID *string

	// ShareSessionEpoch is the current share session epoch: 0 to open a share
	// session; -1 to close it; otherwise increments for consecutive requests.
	ShareSessionEpoch int32

	// IsRenewAck indicates whether Renew type acknowledgements are present
	// in AcknowledgementBatches.
	IsRenewAck bool // v2+

	// Topics are the topics containing records to acknowledge.
	Topics []ShareAcknowledgeRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareAcknowledgeRequest) Key() int16                 { return 79 }
func (*ShareAcknowledgeRequest) MaxVersion() int16          { return 2 }
func (v *ShareAcknowledgeRequest) SetVersion(version int16) { v.Version = version }
func (v *ShareAcknowledgeRequest) GetVersion() int16        { return v.Version }
func (v *ShareAcknowledgeRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *ShareAcknowledgeRequest) ResponseKind() Response {
	r := &ShareAcknowledgeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ShareAcknowledgeRequest) RequestWith(ctx context.Context, r Requestor) (*ShareAcknowledgeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ShareAcknowledgeResponse)
	return resp, err
}

func (v *ShareAcknowledgeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.ShareSessionEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	if version >= 2 {
		v := v.IsRenewAck
		dst = kbin.AppendBool(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.AcknowledgementBatches
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LastOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.AcknowledgeTypes
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									dst = kbin.AppendInt8(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareAcknowledgeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareAcknowledgeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareAcknowledgeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.GroupID = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.ShareSessionEpoch = v
	}
	if version >= 2 {
		v := b.Bool()
		s.IsRenewAck = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareAcknowledgeRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareAcknowledgeRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := s.AcknowledgementBatches
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]ShareAcknowledgeRequestTopicPartitionAcknowledgementBatch, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							{
								v := b.Int64()
								s.LastOffset = v
							}
							{
								v := s.AcknowledgeTypes
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]int8, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := b.Int8()
									a[i] = v
								}
								v = a
								s.AcknowledgeTypes = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.AcknowledgementBatches = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareAcknowledgeRequest returns a pointer to a default ShareAcknowledgeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareAcknowledgeRequest() *ShareAcknowledgeRequest {
	var v ShareAcknowledgeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeRequest.
func (v *ShareAcknowledgeRequest) Default() {
}

// NewShareAcknowledgeRequest returns a default ShareAcknowledgeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeRequest() ShareAcknowledgeRequest {
	var v ShareAcknowledgeRequest
	v.Default()
	return v
}

type ShareAcknowledgeResponseTopicPartitionCurrentLeader struct {
	// LeaderID is the ID of the current leader or -1 if the leader is
	// unknown.
	LeaderID int32

	// LeaderEpoch is the latest known leader epoch.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeResponseTopicPartitionCurrentLeader.
func (v *ShareAcknowledgeResponseTopicPartitionCurrentLeader) Default() {
}

// NewShareAcknowledgeResponseTopicPartitionCurrentLeader returns a default ShareAcknowledgeResponseTopicPartitionCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeResponseTopicPartitionCurrentLeader() ShareAcknowledgeResponseTopicPartitionCurrentLeader {
	var v ShareAcknowledgeResponseTopicPartitionCurrentLeader
	v.Default()
	return v
}

type ShareAcknowledgeResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// CurrentLeader is the current leader of the partition.
	CurrentLeader ShareAcknowledgeResponseTopicPartitionCurrentLeader

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeResponseTopicPartition.
func (v *ShareAcknowledgeResponseTopicPartition) Default() {
	{
		v := &v.CurrentLeader
		_ = v
	}
}

// NewShareAcknowledgeResponseTopicPartition returns a default ShareAcknowledgeResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeResponseTopicPartition() ShareAcknowledgeResponseTopicPartition {
	var v ShareAcknowledgeResponseTopicPartition
	v.Default()
	return v
}

type ShareAcknowledgeResponseTopic struct {
	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the topic partitions.
	Partitions []ShareAcknowledgeResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeResponseTopic.
func (v *ShareAcknowledgeResponseTopic) Default() {
}

// NewShareAcknowledgeResponseTopic returns a default ShareAcknowledgeResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeResponseTopic() ShareAcknowledgeResponseTopic {
	var v ShareAcknowledgeResponseTopic
	v.Default()
	return v
}

type ShareAcknowledgeResponseNodeEndpoint struct {
	// NodeID is the ID of the associated node.
	NodeID int32

	// Host is the node's hostname.
	Host string

	// Port is the node's port.
	Port int32

	// Rack is the rack of the node, or null if it has not been assigned to a
	// rack.
	Rack *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeResponseNodeEndpoint.
func (v *ShareAcknowledgeResponseNodeEndpoint) Default() {
}

// NewShareAcknowledgeResponseNodeEndpoint returns a default ShareAcknowledgeResponseNodeEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeResponseNodeEndpoint() ShareAcknowledgeResponseNodeEndpoint {
	var v ShareAcknowledgeResponseNodeEndpoint
	v.Default()
	return v
}

// ShareAcknowledgeResponse is a response for a ShareAcknowledgeRequest.
type ShareAcknowledgeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the top level response error code.
	//
	// Supported errors:
	// - GROUP_AUTHORIZATION_FAILED (version 0+)
	// - TOPIC_AUTHORIZATION_FAILED (version 0+)
	// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
	// - SHARE_SESSION_NOT_FOUND (version 0+)
	// - INVALID_SHARE_SESSION_EPOCH (version 0+)
	// - NOT_LEADER_OR_FOLLOWER (version 0+)
	// - UNKNOWN_TOPIC_ID (version 0+)
	// - INVALID_RECORD_STATE (version 0+)
	// - KAFKA_STORAGE_ERROR (version 0+)
	// - INVALID_REQUEST (version 0+)
	// - UNKNOWN_SERVER_ERROR (version 0+)
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// AcquisitionLockTimeoutMillis is the time in milliseconds for which the
	// acquired records are locked.
	AcquisitionLockTimeoutMillis int32 // v2+

	// Topics are the response topics.
	Topics []ShareAcknowledgeResponseTopic

	// NodeEndpoints are endpoints for all current leaders enumerated in
	// PartitionData with error NOT_LEADER_OR_FOLLOWER.
	NodeEndpoints []ShareAcknowledgeResponseNodeEndpoint

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ShareAcknowledgeResponse) Key() int16                 { return 79 }
func (*ShareAcknowledgeResponse) MaxVersion() int16          { return 2 }
func (v *ShareAcknowledgeResponse) SetVersion(version int16) { v.Version = version }
func (v *ShareAcknowledgeResponse) GetVersion() int16        { return v.Version }
func (v *ShareAcknowledgeResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ShareAcknowledgeResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *ShareAcknowledgeResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *ShareAcknowledgeResponse) RequestKind() Request {
	return &ShareAcknowledgeRequest{Version: v.Version}
}

func (v *ShareAcknowledgeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if version >= 2 {
		v := v.AcquisitionLockTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := &v.CurrentLeader
						{
							v := v.LeaderID
							dst = kbin.AppendInt32(dst, v)
						}
						{
							v := v.LeaderEpoch
							dst = kbin.AppendInt32(dst, v)
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.NodeEndpoints
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.NodeID
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Rack
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ShareAcknowledgeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ShareAcknowledgeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ShareAcknowledgeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if version >= 2 {
		v := b.Int32()
		s.AcquisitionLockTimeoutMillis = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareAcknowledgeResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ShareAcknowledgeResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := &s.CurrentLeader
						v.Default()
						s := v
						{
							v := b.Int32()
							s.LeaderID = v
						}
						{
							v := b.Int32()
							s.LeaderEpoch = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	{
		v := s.NodeEndpoints
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ShareAcknowledgeResponseNodeEndpoint, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int32()
				s.NodeID = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Int32()
				s.Port = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.Rack = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.NodeEndpoints = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrShareAcknowledgeResponse returns a pointer to a default ShareAcknowledgeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrShareAcknowledgeResponse() *ShareAcknowledgeResponse {
	var v ShareAcknowledgeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ShareAcknowledgeResponse.
func (v *ShareAcknowledgeResponse) Default() {
}

// NewShareAcknowledgeResponse returns a default ShareAcknowledgeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewShareAcknowledgeResponse() ShareAcknowledgeResponse {
	var v ShareAcknowledgeResponse
	v.Default()
	return v
}

type AddRaftVoterRequestListener struct {
	// The name of the endpoint.
	Name string

	// The hostname.
	Host string

	// The port.
	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddRaftVoterRequestListener.
func (v *AddRaftVoterRequestListener) Default() {
}

// NewAddRaftVoterRequestListener returns a default AddRaftVoterRequestListener
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddRaftVoterRequestListener() AddRaftVoterRequestListener {
	var v AddRaftVoterRequestListener
	v.Default()
	return v
}

// AddRaftVoter, added for KIP-853, allows you to manage your KRaft
// controllers.
// Version 1, introduced in Kafka 4.2, adds AckWhenCommitted (KIP-1186).
type AddRaftVoterRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The cluster ID of the request.
	ClusterID *string

	// TimeoutMillis is how long Kafka can wait before responding to this request.
	// This field has no effect on Kafka's processing of the request; the request
	// will continue to be processed if the timeout is reached. If the timeout is
	// reached, Kafka will reply with a REQUEST_TIMED_OUT error.
	//
	// This field has a default of 15000.
	TimeoutMillis int32

	// The replica ID of the voter getting added to the topic partition.
	VoterID int32

	// The directory ID of the voter getting added to the topic partition.
	VoterDirectoryID [16]byte

	// The endpoints that can be used to communicate with the voter.
	Listeners []AddRaftVoterRequestListener

	// When true, return a response after the new voter set is committed.
	// Otherwise, return after the leader writes the changes locally.
	//
	// This field has a default of true.
	AckWhenCommitted bool // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AddRaftVoterRequest) Key() int16                       { return 80 }
func (*AddRaftVoterRequest) MaxVersion() int16                { return 1 }
func (v *AddRaftVoterRequest) SetVersion(version int16)       { v.Version = version }
func (v *AddRaftVoterRequest) GetVersion() int16              { return v.Version }
func (v *AddRaftVoterRequest) IsFlexible() bool               { return v.Version >= 0 }
func (v *AddRaftVoterRequest) Timeout() int32                 { return v.TimeoutMillis }
func (v *AddRaftVoterRequest) SetTimeout(timeoutMillis int32) { v.TimeoutMillis = timeoutMillis }
func (v *AddRaftVoterRequest) ResponseKind() Response {
	r := &AddRaftVoterResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AddRaftVoterRequest) RequestWith(ctx context.Context, r Requestor) (*AddRaftVoterResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AddRaftVoterResponse)
	return resp, err
}

func (v *AddRaftVoterRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.TimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.VoterID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.VoterDirectoryID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.Listeners
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if version >= 1 {
		v := v.AckWhenCommitted
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddRaftVoterRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddRaftVoterRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddRaftVoterRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	{
		v := b.Int32()
		s.TimeoutMillis = v
	}
	{
		v := b.Int32()
		s.VoterID = v
	}
	{
		v := b.Uuid()
		s.VoterDirectoryID = v
	}
	{
		v := s.Listeners
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AddRaftVoterRequestListener, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Listeners = v
	}
	if version >= 1 {
		v := b.Bool()
		s.AckWhenCommitted = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddRaftVoterRequest returns a pointer to a default AddRaftVoterRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddRaftVoterRequest() *AddRaftVoterRequest {
	var v AddRaftVoterRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddRaftVoterRequest.
func (v *AddRaftVoterRequest) Default() {
	v.TimeoutMillis = 15000
	v.AckWhenCommitted = true
}

// NewAddRaftVoterRequest returns a default AddRaftVoterRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddRaftVoterRequest() AddRaftVoterRequest {
	var v AddRaftVoterRequest
	v.Default()
	return v
}

type AddRaftVoterResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AddRaftVoterResponse) Key() int16                         { return 80 }
func (*AddRaftVoterResponse) MaxVersion() int16                  { return 1 }
func (v *AddRaftVoterResponse) SetVersion(version int16)         { v.Version = version }
func (v *AddRaftVoterResponse) GetVersion() int16                { return v.Version }
func (v *AddRaftVoterResponse) IsFlexible() bool                 { return v.Version >= 0 }
func (v *AddRaftVoterResponse) Throttle() (int32, bool)          { return v.ThrottleMillis, v.Version >= 0 }
func (v *AddRaftVoterResponse) SetThrottle(throttleMillis int32) { v.ThrottleMillis = throttleMillis }
func (v *AddRaftVoterResponse) RequestKind() Request             { return &AddRaftVoterRequest{Version: v.Version} }

func (v *AddRaftVoterResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AddRaftVoterResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AddRaftVoterResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AddRaftVoterResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAddRaftVoterResponse returns a pointer to a default AddRaftVoterResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAddRaftVoterResponse() *AddRaftVoterResponse {
	var v AddRaftVoterResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AddRaftVoterResponse.
func (v *AddRaftVoterResponse) Default() {
}

// NewAddRaftVoterResponse returns a default AddRaftVoterResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAddRaftVoterResponse() AddRaftVoterResponse {
	var v AddRaftVoterResponse
	v.Default()
	return v
}

// RemoveRaftVoter, added for KIP-853, allows you to manage your KRaft
// controllers.
type RemoveRaftVoterRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The cluster ID of the request.
	ClusterID *string

	// The replica ID of the voter getting added to the topic partition.
	VoterID int32

	// The directory ID of the voter getting added to the topic partition.
	VoterDirectoryID [16]byte

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*RemoveRaftVoterRequest) Key() int16                 { return 81 }
func (*RemoveRaftVoterRequest) MaxVersion() int16          { return 0 }
func (v *RemoveRaftVoterRequest) SetVersion(version int16) { v.Version = version }
func (v *RemoveRaftVoterRequest) GetVersion() int16        { return v.Version }
func (v *RemoveRaftVoterRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *RemoveRaftVoterRequest) ResponseKind() Response {
	r := &RemoveRaftVoterResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *RemoveRaftVoterRequest) RequestWith(ctx context.Context, r Requestor) (*RemoveRaftVoterResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*RemoveRaftVoterResponse)
	return resp, err
}

func (v *RemoveRaftVoterRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.VoterID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.VoterDirectoryID
		dst = kbin.AppendUuid(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *RemoveRaftVoterRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *RemoveRaftVoterRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *RemoveRaftVoterRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	{
		v := b.Int32()
		s.VoterID = v
	}
	{
		v := b.Uuid()
		s.VoterDirectoryID = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrRemoveRaftVoterRequest returns a pointer to a default RemoveRaftVoterRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrRemoveRaftVoterRequest() *RemoveRaftVoterRequest {
	var v RemoveRaftVoterRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to RemoveRaftVoterRequest.
func (v *RemoveRaftVoterRequest) Default() {
}

// NewRemoveRaftVoterRequest returns a default RemoveRaftVoterRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewRemoveRaftVoterRequest() RemoveRaftVoterRequest {
	var v RemoveRaftVoterRequest
	v.Default()
	return v
}

type RemoveRaftVoterResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*RemoveRaftVoterResponse) Key() int16                 { return 81 }
func (*RemoveRaftVoterResponse) MaxVersion() int16          { return 0 }
func (v *RemoveRaftVoterResponse) SetVersion(version int16) { v.Version = version }
func (v *RemoveRaftVoterResponse) GetVersion() int16        { return v.Version }
func (v *RemoveRaftVoterResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *RemoveRaftVoterResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *RemoveRaftVoterResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *RemoveRaftVoterResponse) RequestKind() Request {
	return &RemoveRaftVoterRequest{Version: v.Version}
}

func (v *RemoveRaftVoterResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *RemoveRaftVoterResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *RemoveRaftVoterResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *RemoveRaftVoterResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrRemoveRaftVoterResponse returns a pointer to a default RemoveRaftVoterResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrRemoveRaftVoterResponse() *RemoveRaftVoterResponse {
	var v RemoveRaftVoterResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to RemoveRaftVoterResponse.
func (v *RemoveRaftVoterResponse) Default() {
}

// NewRemoveRaftVoterResponse returns a default RemoveRaftVoterResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewRemoveRaftVoterResponse() RemoveRaftVoterResponse {
	var v RemoveRaftVoterResponse
	v.Default()
	return v
}

type UpdateRaftVoterRequestListener struct {
	// The name of the endpoint.
	Name string

	// The hostname.
	Host string

	// The port.
	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateRaftVoterRequestListener.
func (v *UpdateRaftVoterRequestListener) Default() {
}

// NewUpdateRaftVoterRequestListener returns a default UpdateRaftVoterRequestListener
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateRaftVoterRequestListener() UpdateRaftVoterRequestListener {
	var v UpdateRaftVoterRequestListener
	v.Default()
	return v
}

type UpdateRaftVoterRequestKRaftVersionFeature struct {
	// The min supported KRaft protocol version.
	MinSupportedVersion int16

	// The max supported KRaft protocol version.
	MaxSupportedVersion int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateRaftVoterRequestKRaftVersionFeature.
func (v *UpdateRaftVoterRequestKRaftVersionFeature) Default() {
}

// NewUpdateRaftVoterRequestKRaftVersionFeature returns a default UpdateRaftVoterRequestKRaftVersionFeature
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateRaftVoterRequestKRaftVersionFeature() UpdateRaftVoterRequestKRaftVersionFeature {
	var v UpdateRaftVoterRequestKRaftVersionFeature
	v.Default()
	return v
}

// UpdateRaftVoterRequest, added for KIP-853, allows you to manage your KRaft
// controllers.
type UpdateRaftVoterRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// The cluster ID of the request.
	ClusterID *string

	// The current leader epoch of the partition; -1 if unknown.
	CurrentLeaderEpoch int32

	// The replica ID of the voter getting added to the topic partition.
	VoterID int32

	// The directory ID of the voter getting added to the topic partition.
	VoterDirectoryID [16]byte

	// The endpoints that can be used to communicate with the leader.
	Listeners []UpdateRaftVoterRequestListener

	// The range of versions of the protocol that the replica supports.
	KRaftVersionFeature UpdateRaftVoterRequestKRaftVersionFeature

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UpdateRaftVoterRequest) Key() int16                 { return 82 }
func (*UpdateRaftVoterRequest) MaxVersion() int16          { return 0 }
func (v *UpdateRaftVoterRequest) SetVersion(version int16) { v.Version = version }
func (v *UpdateRaftVoterRequest) GetVersion() int16        { return v.Version }
func (v *UpdateRaftVoterRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *UpdateRaftVoterRequest) ResponseKind() Response {
	r := &UpdateRaftVoterResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *UpdateRaftVoterRequest) RequestWith(ctx context.Context, r Requestor) (*UpdateRaftVoterResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*UpdateRaftVoterResponse)
	return resp, err
}

func (v *UpdateRaftVoterRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ClusterID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.CurrentLeaderEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.VoterID
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.VoterDirectoryID
		dst = kbin.AppendUuid(dst, v)
	}
	{
		v := v.Listeners
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Name
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := &v.KRaftVersionFeature
		{
			v := v.MinSupportedVersion
			dst = kbin.AppendInt16(dst, v)
		}
		{
			v := v.MaxSupportedVersion
			dst = kbin.AppendInt16(dst, v)
		}
		if isFlexible {
			dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
			dst = v.UnknownTags.AppendEach(dst)
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateRaftVoterRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateRaftVoterRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateRaftVoterRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ClusterID = v
	}
	{
		v := b.Int32()
		s.CurrentLeaderEpoch = v
	}
	{
		v := b.Int32()
		s.VoterID = v
	}
	{
		v := b.Uuid()
		s.VoterDirectoryID = v
	}
	{
		v := s.Listeners
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]UpdateRaftVoterRequestListener, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Name = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Listeners = v
	}
	{
		v := &s.KRaftVersionFeature
		v.Default()
		s := v
		{
			v := b.Int16()
			s.MinSupportedVersion = v
		}
		{
			v := b.Int16()
			s.MaxSupportedVersion = v
		}
		if isFlexible {
			s.UnknownTags = internalReadTags(&b)
		}
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrUpdateRaftVoterRequest returns a pointer to a default UpdateRaftVoterRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateRaftVoterRequest() *UpdateRaftVoterRequest {
	var v UpdateRaftVoterRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateRaftVoterRequest.
func (v *UpdateRaftVoterRequest) Default() {
	{
		v := &v.KRaftVersionFeature
		_ = v
	}
}

// NewUpdateRaftVoterRequest returns a default UpdateRaftVoterRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateRaftVoterRequest() UpdateRaftVoterRequest {
	var v UpdateRaftVoterRequest
	v.Default()
	return v
}

type UpdateRaftVoterResponseCurrentLeader struct {
	// The replica ID of the current leader, or -1 if unknown.
	//
	// This field has a default of -1.
	LeaderID int32

	// The latest known leader epoch.
	//
	// This field has a default of -1.
	LeaderEpoch int32

	// The node's hostname.
	Host string

	// The node's port.
	Port int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateRaftVoterResponseCurrentLeader.
func (v *UpdateRaftVoterResponseCurrentLeader) Default() {
	v.LeaderID = -1
	v.LeaderEpoch = -1
}

// NewUpdateRaftVoterResponseCurrentLeader returns a default UpdateRaftVoterResponseCurrentLeader
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateRaftVoterResponseCurrentLeader() UpdateRaftVoterResponseCurrentLeader {
	var v UpdateRaftVoterResponseCurrentLeader
	v.Default()
	return v
}

type UpdateRaftVoterResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	ErrorCode int16

	// Defaults of the current Raft leader.
	CurrentLeader UpdateRaftVoterResponseCurrentLeader // tag 0

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*UpdateRaftVoterResponse) Key() int16                 { return 82 }
func (*UpdateRaftVoterResponse) MaxVersion() int16          { return 0 }
func (v *UpdateRaftVoterResponse) SetVersion(version int16) { v.Version = version }
func (v *UpdateRaftVoterResponse) GetVersion() int16        { return v.Version }
func (v *UpdateRaftVoterResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *UpdateRaftVoterResponse) Throttle() (int32, bool)  { return v.ThrottleMillis, v.Version >= 0 }
func (v *UpdateRaftVoterResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *UpdateRaftVoterResponse) RequestKind() Request {
	return &UpdateRaftVoterRequest{Version: v.Version}
}

func (v *UpdateRaftVoterResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	if isFlexible {
		var toEncode []uint32
		if !reflect.DeepEqual(v.CurrentLeader, (func() UpdateRaftVoterResponseCurrentLeader {
			var v UpdateRaftVoterResponseCurrentLeader
			v.Default()
			return v
		})()) {
			toEncode = append(toEncode, 0)
		}
		dst = kbin.AppendUvarint(dst, uint32(len(toEncode)+v.UnknownTags.Len()))
		for _, tag := range toEncode {
			switch tag {
			case 0:
				{
					v := v.CurrentLeader
					dst = kbin.AppendUvarint(dst, 0)
					sized := false
					lenAt := len(dst)
				fCurrentLeader:
					{
						v := v.LeaderID
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Host
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Port
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
					if !sized {
						dst = kbin.AppendUvarint(dst[:lenAt], uint32(len(dst[lenAt:])))
						sized = true
						goto fCurrentLeader
					}
				}
			}
		}
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *UpdateRaftVoterResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *UpdateRaftVoterResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *UpdateRaftVoterResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	if isFlexible {
		for i := b.Uvarint(); i > 0; i-- {
			switch key := b.Uvarint(); key {
			default:
				s.UnknownTags.Set(key, b.Span(int(b.Uvarint())))
			case 0:
				b := kbin.Reader{Src: b.Span(int(b.Uvarint()))}
				v := &s.CurrentLeader
				v.Default()
				s := v
				{
					v := b.Int32()
					s.LeaderID = v
				}
				{
					v := b.Int32()
					s.LeaderEpoch = v
				}
				{
					var v string
					if unsafe {
						if isFlexible {
							v = b.UnsafeCompactString()
						} else {
							v = b.UnsafeString()
						}
					} else {
						if isFlexible {
							v = b.CompactString()
						} else {
							v = b.String()
						}
					}
					s.Host = v
				}
				{
					v := b.Int32()
					s.Port = v
				}
				if isFlexible {
					s.UnknownTags = internalReadTags(&b)
				}
				if err := b.Complete(); err != nil {
					return err
				}
			}
		}
	}
	return b.Complete()
}

// NewPtrUpdateRaftVoterResponse returns a pointer to a default UpdateRaftVoterResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrUpdateRaftVoterResponse() *UpdateRaftVoterResponse {
	var v UpdateRaftVoterResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to UpdateRaftVoterResponse.
func (v *UpdateRaftVoterResponse) Default() {
	{
		v := &v.CurrentLeader
		_ = v
		v.LeaderID = -1
		v.LeaderEpoch = -1
	}
}

// NewUpdateRaftVoterResponse returns a default UpdateRaftVoterResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewUpdateRaftVoterResponse() UpdateRaftVoterResponse {
	var v UpdateRaftVoterResponse
	v.Default()
	return v
}

type InitializeShareGroupStateRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// StateEpoch is the state epoch for this share-partition.
	StateEpoch int32

	// StartOffset is the share-partition start offset, or -1 if the start
	// offset is not being initialized.
	StartOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateRequestTopicPartition.
func (v *InitializeShareGroupStateRequestTopicPartition) Default() {
}

// NewInitializeShareGroupStateRequestTopicPartition returns a default InitializeShareGroupStateRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateRequestTopicPartition() InitializeShareGroupStateRequestTopicPartition {
	var v InitializeShareGroupStateRequestTopicPartition
	v.Default()
	return v
}

type InitializeShareGroupStateRequestTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the data for the partitions.
	Partitions []InitializeShareGroupStateRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateRequestTopic.
func (v *InitializeShareGroupStateRequestTopic) Default() {
}

// NewInitializeShareGroupStateRequestTopic returns a default InitializeShareGroupStateRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateRequestTopic() InitializeShareGroupStateRequestTopic {
	var v InitializeShareGroupStateRequestTopic
	v.Default()
	return v
}

// InitializeShareGroupStateRequest is a request to initialize share group state.
type InitializeShareGroupStateRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the data for the topics.
	Topics []InitializeShareGroupStateRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*InitializeShareGroupStateRequest) Key() int16                   { return 83 }
func (*InitializeShareGroupStateRequest) MaxVersion() int16            { return 0 }
func (v *InitializeShareGroupStateRequest) SetVersion(version int16)   { v.Version = version }
func (v *InitializeShareGroupStateRequest) GetVersion() int16          { return v.Version }
func (v *InitializeShareGroupStateRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *InitializeShareGroupStateRequest) IsShareCoordinatorRequest() {}
func (v *InitializeShareGroupStateRequest) ResponseKind() Response {
	r := &InitializeShareGroupStateResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *InitializeShareGroupStateRequest) RequestWith(ctx context.Context, r Requestor) (*InitializeShareGroupStateResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*InitializeShareGroupStateResponse)
	return resp, err
}

func (v *InitializeShareGroupStateRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StateEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *InitializeShareGroupStateRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *InitializeShareGroupStateRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *InitializeShareGroupStateRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]InitializeShareGroupStateRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]InitializeShareGroupStateRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.StateEpoch = v
					}
					{
						v := b.Int64()
						s.StartOffset = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrInitializeShareGroupStateRequest returns a pointer to a default InitializeShareGroupStateRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrInitializeShareGroupStateRequest() *InitializeShareGroupStateRequest {
	var v InitializeShareGroupStateRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateRequest.
func (v *InitializeShareGroupStateRequest) Default() {
}

// NewInitializeShareGroupStateRequest returns a default InitializeShareGroupStateRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateRequest() InitializeShareGroupStateRequest {
	var v InitializeShareGroupStateRequest
	v.Default()
	return v
}

type InitializeShareGroupStateResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateResponseTopicPartition.
func (v *InitializeShareGroupStateResponseTopicPartition) Default() {
}

// NewInitializeShareGroupStateResponseTopicPartition returns a default InitializeShareGroupStateResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateResponseTopicPartition() InitializeShareGroupStateResponseTopicPartition {
	var v InitializeShareGroupStateResponseTopicPartition
	v.Default()
	return v
}

type InitializeShareGroupStateResponseTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the results for the partitions.
	Partitions []InitializeShareGroupStateResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateResponseTopic.
func (v *InitializeShareGroupStateResponseTopic) Default() {
}

// NewInitializeShareGroupStateResponseTopic returns a default InitializeShareGroupStateResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateResponseTopic() InitializeShareGroupStateResponseTopic {
	var v InitializeShareGroupStateResponseTopic
	v.Default()
	return v
}

// InitializeShareGroupStateResponse is a response for an InitializeShareGroupStateRequest.
//
// Supported errors:
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - FENCED_STATE_EPOCH (version 0+)
// - INVALID_REQUEST (version 0+)
type InitializeShareGroupStateResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics are the initialization results.
	Topics []InitializeShareGroupStateResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*InitializeShareGroupStateResponse) Key() int16                 { return 83 }
func (*InitializeShareGroupStateResponse) MaxVersion() int16          { return 0 }
func (v *InitializeShareGroupStateResponse) SetVersion(version int16) { v.Version = version }
func (v *InitializeShareGroupStateResponse) GetVersion() int16        { return v.Version }
func (v *InitializeShareGroupStateResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *InitializeShareGroupStateResponse) RequestKind() Request {
	return &InitializeShareGroupStateRequest{Version: v.Version}
}

func (v *InitializeShareGroupStateResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *InitializeShareGroupStateResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *InitializeShareGroupStateResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *InitializeShareGroupStateResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]InitializeShareGroupStateResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]InitializeShareGroupStateResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrInitializeShareGroupStateResponse returns a pointer to a default InitializeShareGroupStateResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrInitializeShareGroupStateResponse() *InitializeShareGroupStateResponse {
	var v InitializeShareGroupStateResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to InitializeShareGroupStateResponse.
func (v *InitializeShareGroupStateResponse) Default() {
}

// NewInitializeShareGroupStateResponse returns a default InitializeShareGroupStateResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewInitializeShareGroupStateResponse() InitializeShareGroupStateResponse {
	var v InitializeShareGroupStateResponse
	v.Default()
	return v
}

type ReadShareGroupStateRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// LeaderEpoch is the leader epoch of the share-partition.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateRequestTopicPartition.
func (v *ReadShareGroupStateRequestTopicPartition) Default() {
}

// NewReadShareGroupStateRequestTopicPartition returns a default ReadShareGroupStateRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateRequestTopicPartition() ReadShareGroupStateRequestTopicPartition {
	var v ReadShareGroupStateRequestTopicPartition
	v.Default()
	return v
}

type ReadShareGroupStateRequestTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the data for the partitions.
	Partitions []ReadShareGroupStateRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateRequestTopic.
func (v *ReadShareGroupStateRequestTopic) Default() {
}

// NewReadShareGroupStateRequestTopic returns a default ReadShareGroupStateRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateRequestTopic() ReadShareGroupStateRequestTopic {
	var v ReadShareGroupStateRequestTopic
	v.Default()
	return v
}

// ReadShareGroupStateRequest is a request to read share group state.
type ReadShareGroupStateRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the data for the topics.
	Topics []ReadShareGroupStateRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ReadShareGroupStateRequest) Key() int16                   { return 84 }
func (*ReadShareGroupStateRequest) MaxVersion() int16            { return 0 }
func (v *ReadShareGroupStateRequest) SetVersion(version int16)   { v.Version = version }
func (v *ReadShareGroupStateRequest) GetVersion() int16          { return v.Version }
func (v *ReadShareGroupStateRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *ReadShareGroupStateRequest) IsShareCoordinatorRequest() {}
func (v *ReadShareGroupStateRequest) ResponseKind() Response {
	r := &ReadShareGroupStateResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ReadShareGroupStateRequest) RequestWith(ctx context.Context, r Requestor) (*ReadShareGroupStateResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ReadShareGroupStateResponse)
	return resp, err
}

func (v *ReadShareGroupStateRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ReadShareGroupStateRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ReadShareGroupStateRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ReadShareGroupStateRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ReadShareGroupStateRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ReadShareGroupStateRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrReadShareGroupStateRequest returns a pointer to a default ReadShareGroupStateRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrReadShareGroupStateRequest() *ReadShareGroupStateRequest {
	var v ReadShareGroupStateRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateRequest.
func (v *ReadShareGroupStateRequest) Default() {
}

// NewReadShareGroupStateRequest returns a default ReadShareGroupStateRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateRequest() ReadShareGroupStateRequest {
	var v ReadShareGroupStateRequest
	v.Default()
	return v
}

type ReadShareGroupStateResponseTopicPartitionStateBatch struct {
	// FirstOffset is the first offset of this state batch.
	FirstOffset int64

	// LastOffset is the last offset of this state batch.
	LastOffset int64

	// DeliveryState is the delivery state -
	// 0:Available,2:Acked,4:Archived.
	DeliveryState int8

	// DeliveryCount is the delivery count.
	DeliveryCount int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateResponseTopicPartitionStateBatch.
func (v *ReadShareGroupStateResponseTopicPartitionStateBatch) Default() {
}

// NewReadShareGroupStateResponseTopicPartitionStateBatch returns a default ReadShareGroupStateResponseTopicPartitionStateBatch
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateResponseTopicPartitionStateBatch() ReadShareGroupStateResponseTopicPartitionStateBatch {
	var v ReadShareGroupStateResponseTopicPartitionStateBatch
	v.Default()
	return v
}

type ReadShareGroupStateResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// StateEpoch is the state epoch of the share-partition.
	StateEpoch int32

	// StartOffset is the share-partition start offset, which can be -1 if
	// it is not yet initialized.
	StartOffset int64

	// StateBatches are the state batches for this share-partition.
	StateBatches []ReadShareGroupStateResponseTopicPartitionStateBatch

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateResponseTopicPartition.
func (v *ReadShareGroupStateResponseTopicPartition) Default() {
}

// NewReadShareGroupStateResponseTopicPartition returns a default ReadShareGroupStateResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateResponseTopicPartition() ReadShareGroupStateResponseTopicPartition {
	var v ReadShareGroupStateResponseTopicPartition
	v.Default()
	return v
}

type ReadShareGroupStateResponseTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the results for the partitions.
	Partitions []ReadShareGroupStateResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateResponseTopic.
func (v *ReadShareGroupStateResponseTopic) Default() {
}

// NewReadShareGroupStateResponseTopic returns a default ReadShareGroupStateResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateResponseTopic() ReadShareGroupStateResponseTopic {
	var v ReadShareGroupStateResponseTopic
	v.Default()
	return v
}

// ReadShareGroupStateResponse is a response for a ReadShareGroupStateRequest.
//
// Supported errors:
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
// - FENCED_LEADER_EPOCH (version 0+)
// - INVALID_REQUEST (version 0+)
type ReadShareGroupStateResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics are the read results.
	Topics []ReadShareGroupStateResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ReadShareGroupStateResponse) Key() int16                 { return 84 }
func (*ReadShareGroupStateResponse) MaxVersion() int16          { return 0 }
func (v *ReadShareGroupStateResponse) SetVersion(version int16) { v.Version = version }
func (v *ReadShareGroupStateResponse) GetVersion() int16        { return v.Version }
func (v *ReadShareGroupStateResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ReadShareGroupStateResponse) RequestKind() Request {
	return &ReadShareGroupStateRequest{Version: v.Version}
}

func (v *ReadShareGroupStateResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.StateEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					{
						v := v.StateBatches
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LastOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.DeliveryState
								dst = kbin.AppendInt8(dst, v)
							}
							{
								v := v.DeliveryCount
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ReadShareGroupStateResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ReadShareGroupStateResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ReadShareGroupStateResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ReadShareGroupStateResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ReadShareGroupStateResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := b.Int32()
						s.StateEpoch = v
					}
					{
						v := b.Int64()
						s.StartOffset = v
					}
					{
						v := s.StateBatches
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]ReadShareGroupStateResponseTopicPartitionStateBatch, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							{
								v := b.Int64()
								s.LastOffset = v
							}
							{
								v := b.Int8()
								s.DeliveryState = v
							}
							{
								v := b.Int16()
								s.DeliveryCount = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.StateBatches = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrReadShareGroupStateResponse returns a pointer to a default ReadShareGroupStateResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrReadShareGroupStateResponse() *ReadShareGroupStateResponse {
	var v ReadShareGroupStateResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateResponse.
func (v *ReadShareGroupStateResponse) Default() {
}

// NewReadShareGroupStateResponse returns a default ReadShareGroupStateResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateResponse() ReadShareGroupStateResponse {
	var v ReadShareGroupStateResponse
	v.Default()
	return v
}

type WriteShareGroupStateRequestTopicPartitionStateBatch struct {
	// FirstOffset is the first offset of this state batch.
	FirstOffset int64

	// LastOffset is the last offset of this state batch.
	LastOffset int64

	// DeliveryState is the delivery state -
	// 0:Available,2:Acked,4:Archived.
	DeliveryState int8

	// DeliveryCount is the delivery count.
	DeliveryCount int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateRequestTopicPartitionStateBatch.
func (v *WriteShareGroupStateRequestTopicPartitionStateBatch) Default() {
}

// NewWriteShareGroupStateRequestTopicPartitionStateBatch returns a default WriteShareGroupStateRequestTopicPartitionStateBatch
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateRequestTopicPartitionStateBatch() WriteShareGroupStateRequestTopicPartitionStateBatch {
	var v WriteShareGroupStateRequestTopicPartitionStateBatch
	v.Default()
	return v
}

type WriteShareGroupStateRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// StateEpoch is the state epoch of the share-partition.
	StateEpoch int32

	// LeaderEpoch is the leader epoch of the share-partition.
	LeaderEpoch int32

	// StartOffset is the share-partition start offset, or -1 if the start
	// offset is not being written.
	StartOffset int64

	// DeliveryCompleteCount is the number of offsets >= share-partition start
	// offset for which delivery has been completed. -1 if not set.
	//
	// This field has a default of -1.
	DeliveryCompleteCount int32 // v1+

	// StateBatches are the state batches for the share-partition.
	StateBatches []WriteShareGroupStateRequestTopicPartitionStateBatch

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateRequestTopicPartition.
func (v *WriteShareGroupStateRequestTopicPartition) Default() {
	v.DeliveryCompleteCount = -1
}

// NewWriteShareGroupStateRequestTopicPartition returns a default WriteShareGroupStateRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateRequestTopicPartition() WriteShareGroupStateRequestTopicPartition {
	var v WriteShareGroupStateRequestTopicPartition
	v.Default()
	return v
}

type WriteShareGroupStateRequestTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the data for the partitions.
	Partitions []WriteShareGroupStateRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateRequestTopic.
func (v *WriteShareGroupStateRequestTopic) Default() {
}

// NewWriteShareGroupStateRequestTopic returns a default WriteShareGroupStateRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateRequestTopic() WriteShareGroupStateRequestTopic {
	var v WriteShareGroupStateRequestTopic
	v.Default()
	return v
}

// WriteShareGroupStateRequest is a request to write share group state.
// Version 1, introduced in Kafka 4.2, adds DeliveryCompleteCount (KIP-1226).
type WriteShareGroupStateRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the data for the topics.
	Topics []WriteShareGroupStateRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*WriteShareGroupStateRequest) Key() int16                   { return 85 }
func (*WriteShareGroupStateRequest) MaxVersion() int16            { return 1 }
func (v *WriteShareGroupStateRequest) SetVersion(version int16)   { v.Version = version }
func (v *WriteShareGroupStateRequest) GetVersion() int16          { return v.Version }
func (v *WriteShareGroupStateRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *WriteShareGroupStateRequest) IsShareCoordinatorRequest() {}
func (v *WriteShareGroupStateRequest) ResponseKind() Response {
	r := &WriteShareGroupStateResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *WriteShareGroupStateRequest) RequestWith(ctx context.Context, r Requestor) (*WriteShareGroupStateResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*WriteShareGroupStateResponse)
	return resp, err
}

func (v *WriteShareGroupStateRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StateEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 1 {
						v := v.DeliveryCompleteCount
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StateBatches
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.FirstOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LastOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.DeliveryState
								dst = kbin.AppendInt8(dst, v)
							}
							{
								v := v.DeliveryCount
								dst = kbin.AppendInt16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *WriteShareGroupStateRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *WriteShareGroupStateRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *WriteShareGroupStateRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]WriteShareGroupStateRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]WriteShareGroupStateRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.StateEpoch = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Int64()
						s.StartOffset = v
					}
					if version >= 1 {
						v := b.Int32()
						s.DeliveryCompleteCount = v
					}
					{
						v := s.StateBatches
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]WriteShareGroupStateRequestTopicPartitionStateBatch, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int64()
								s.FirstOffset = v
							}
							{
								v := b.Int64()
								s.LastOffset = v
							}
							{
								v := b.Int8()
								s.DeliveryState = v
							}
							{
								v := b.Int16()
								s.DeliveryCount = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.StateBatches = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrWriteShareGroupStateRequest returns a pointer to a default WriteShareGroupStateRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrWriteShareGroupStateRequest() *WriteShareGroupStateRequest {
	var v WriteShareGroupStateRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateRequest.
func (v *WriteShareGroupStateRequest) Default() {
}

// NewWriteShareGroupStateRequest returns a default WriteShareGroupStateRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateRequest() WriteShareGroupStateRequest {
	var v WriteShareGroupStateRequest
	v.Default()
	return v
}

type WriteShareGroupStateResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateResponseTopicPartition.
func (v *WriteShareGroupStateResponseTopicPartition) Default() {
}

// NewWriteShareGroupStateResponseTopicPartition returns a default WriteShareGroupStateResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateResponseTopicPartition() WriteShareGroupStateResponseTopicPartition {
	var v WriteShareGroupStateResponseTopicPartition
	v.Default()
	return v
}

type WriteShareGroupStateResponseTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the results for the partitions.
	Partitions []WriteShareGroupStateResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateResponseTopic.
func (v *WriteShareGroupStateResponseTopic) Default() {
}

// NewWriteShareGroupStateResponseTopic returns a default WriteShareGroupStateResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateResponseTopic() WriteShareGroupStateResponseTopic {
	var v WriteShareGroupStateResponseTopic
	v.Default()
	return v
}

// WriteShareGroupStateResponse is a response for a WriteShareGroupStateRequest.
//
// Supported errors:
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
// - FENCED_LEADER_EPOCH (version 0+)
// - FENCED_STATE_EPOCH (version 0+)
// - INVALID_REQUEST (version 0+)
type WriteShareGroupStateResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics are the write results.
	Topics []WriteShareGroupStateResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*WriteShareGroupStateResponse) Key() int16                 { return 85 }
func (*WriteShareGroupStateResponse) MaxVersion() int16          { return 1 }
func (v *WriteShareGroupStateResponse) SetVersion(version int16) { v.Version = version }
func (v *WriteShareGroupStateResponse) GetVersion() int16        { return v.Version }
func (v *WriteShareGroupStateResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *WriteShareGroupStateResponse) RequestKind() Request {
	return &WriteShareGroupStateRequest{Version: v.Version}
}

func (v *WriteShareGroupStateResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *WriteShareGroupStateResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *WriteShareGroupStateResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *WriteShareGroupStateResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]WriteShareGroupStateResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]WriteShareGroupStateResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrWriteShareGroupStateResponse returns a pointer to a default WriteShareGroupStateResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrWriteShareGroupStateResponse() *WriteShareGroupStateResponse {
	var v WriteShareGroupStateResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to WriteShareGroupStateResponse.
func (v *WriteShareGroupStateResponse) Default() {
}

// NewWriteShareGroupStateResponse returns a default WriteShareGroupStateResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewWriteShareGroupStateResponse() WriteShareGroupStateResponse {
	var v WriteShareGroupStateResponse
	v.Default()
	return v
}

type DeleteShareGroupStateRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateRequestTopicPartition.
func (v *DeleteShareGroupStateRequestTopicPartition) Default() {
}

// NewDeleteShareGroupStateRequestTopicPartition returns a default DeleteShareGroupStateRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateRequestTopicPartition() DeleteShareGroupStateRequestTopicPartition {
	var v DeleteShareGroupStateRequestTopicPartition
	v.Default()
	return v
}

type DeleteShareGroupStateRequestTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the data for the partitions.
	Partitions []DeleteShareGroupStateRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateRequestTopic.
func (v *DeleteShareGroupStateRequestTopic) Default() {
}

// NewDeleteShareGroupStateRequestTopic returns a default DeleteShareGroupStateRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateRequestTopic() DeleteShareGroupStateRequestTopic {
	var v DeleteShareGroupStateRequestTopic
	v.Default()
	return v
}

// DeleteShareGroupStateRequest is a request to delete share group state.
type DeleteShareGroupStateRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the data for the topics.
	Topics []DeleteShareGroupStateRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DeleteShareGroupStateRequest) Key() int16                   { return 86 }
func (*DeleteShareGroupStateRequest) MaxVersion() int16            { return 0 }
func (v *DeleteShareGroupStateRequest) SetVersion(version int16)   { v.Version = version }
func (v *DeleteShareGroupStateRequest) GetVersion() int16          { return v.Version }
func (v *DeleteShareGroupStateRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *DeleteShareGroupStateRequest) IsShareCoordinatorRequest() {}
func (v *DeleteShareGroupStateRequest) ResponseKind() Response {
	r := &DeleteShareGroupStateResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteShareGroupStateRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteShareGroupStateResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteShareGroupStateResponse)
	return resp, err
}

func (v *DeleteShareGroupStateRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteShareGroupStateRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteShareGroupStateRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteShareGroupStateRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteShareGroupStateRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DeleteShareGroupStateRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteShareGroupStateRequest returns a pointer to a default DeleteShareGroupStateRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteShareGroupStateRequest() *DeleteShareGroupStateRequest {
	var v DeleteShareGroupStateRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateRequest.
func (v *DeleteShareGroupStateRequest) Default() {
}

// NewDeleteShareGroupStateRequest returns a default DeleteShareGroupStateRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateRequest() DeleteShareGroupStateRequest {
	var v DeleteShareGroupStateRequest
	v.Default()
	return v
}

type DeleteShareGroupStateResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateResponseTopicPartition.
func (v *DeleteShareGroupStateResponseTopicPartition) Default() {
}

// NewDeleteShareGroupStateResponseTopicPartition returns a default DeleteShareGroupStateResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateResponseTopicPartition() DeleteShareGroupStateResponseTopicPartition {
	var v DeleteShareGroupStateResponseTopicPartition
	v.Default()
	return v
}

type DeleteShareGroupStateResponseTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the results for the partitions.
	Partitions []DeleteShareGroupStateResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateResponseTopic.
func (v *DeleteShareGroupStateResponseTopic) Default() {
}

// NewDeleteShareGroupStateResponseTopic returns a default DeleteShareGroupStateResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateResponseTopic() DeleteShareGroupStateResponseTopic {
	var v DeleteShareGroupStateResponseTopic
	v.Default()
	return v
}

// DeleteShareGroupStateResponse is a response for a DeleteShareGroupStateRequest.
//
// Supported errors:
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
// - FENCED_STATE_EPOCH (version 0+)
// - INVALID_REQUEST (version 0+)
type DeleteShareGroupStateResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics are the delete results.
	Topics []DeleteShareGroupStateResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DeleteShareGroupStateResponse) Key() int16                 { return 86 }
func (*DeleteShareGroupStateResponse) MaxVersion() int16          { return 0 }
func (v *DeleteShareGroupStateResponse) SetVersion(version int16) { v.Version = version }
func (v *DeleteShareGroupStateResponse) GetVersion() int16        { return v.Version }
func (v *DeleteShareGroupStateResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DeleteShareGroupStateResponse) RequestKind() Request {
	return &DeleteShareGroupStateRequest{Version: v.Version}
}

func (v *DeleteShareGroupStateResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteShareGroupStateResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteShareGroupStateResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteShareGroupStateResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteShareGroupStateResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DeleteShareGroupStateResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteShareGroupStateResponse returns a pointer to a default DeleteShareGroupStateResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteShareGroupStateResponse() *DeleteShareGroupStateResponse {
	var v DeleteShareGroupStateResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupStateResponse.
func (v *DeleteShareGroupStateResponse) Default() {
}

// NewDeleteShareGroupStateResponse returns a default DeleteShareGroupStateResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupStateResponse() DeleteShareGroupStateResponse {
	var v DeleteShareGroupStateResponse
	v.Default()
	return v
}

type ReadShareGroupStateSummaryRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// LeaderEpoch is the leader epoch of the share-partition.
	LeaderEpoch int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryRequestTopicPartition.
func (v *ReadShareGroupStateSummaryRequestTopicPartition) Default() {
}

// NewReadShareGroupStateSummaryRequestTopicPartition returns a default ReadShareGroupStateSummaryRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryRequestTopicPartition() ReadShareGroupStateSummaryRequestTopicPartition {
	var v ReadShareGroupStateSummaryRequestTopicPartition
	v.Default()
	return v
}

type ReadShareGroupStateSummaryRequestTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the data for the partitions.
	Partitions []ReadShareGroupStateSummaryRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryRequestTopic.
func (v *ReadShareGroupStateSummaryRequestTopic) Default() {
}

// NewReadShareGroupStateSummaryRequestTopic returns a default ReadShareGroupStateSummaryRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryRequestTopic() ReadShareGroupStateSummaryRequestTopic {
	var v ReadShareGroupStateSummaryRequestTopic
	v.Default()
	return v
}

// ReadShareGroupStateSummaryRequest is a request to read share group state summary.
// Version 1, introduced in Kafka 4.2, adds DeliveryCompleteCount to the
// response (KIP-1226).
type ReadShareGroupStateSummaryRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the data for the topics.
	Topics []ReadShareGroupStateSummaryRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ReadShareGroupStateSummaryRequest) Key() int16                   { return 87 }
func (*ReadShareGroupStateSummaryRequest) MaxVersion() int16            { return 1 }
func (v *ReadShareGroupStateSummaryRequest) SetVersion(version int16)   { v.Version = version }
func (v *ReadShareGroupStateSummaryRequest) GetVersion() int16          { return v.Version }
func (v *ReadShareGroupStateSummaryRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *ReadShareGroupStateSummaryRequest) IsShareCoordinatorRequest() {}
func (v *ReadShareGroupStateSummaryRequest) ResponseKind() Response {
	r := &ReadShareGroupStateSummaryResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *ReadShareGroupStateSummaryRequest) RequestWith(ctx context.Context, r Requestor) (*ReadShareGroupStateSummaryResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*ReadShareGroupStateSummaryResponse)
	return resp, err
}

func (v *ReadShareGroupStateSummaryRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ReadShareGroupStateSummaryRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ReadShareGroupStateSummaryRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ReadShareGroupStateSummaryRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ReadShareGroupStateSummaryRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ReadShareGroupStateSummaryRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrReadShareGroupStateSummaryRequest returns a pointer to a default ReadShareGroupStateSummaryRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrReadShareGroupStateSummaryRequest() *ReadShareGroupStateSummaryRequest {
	var v ReadShareGroupStateSummaryRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryRequest.
func (v *ReadShareGroupStateSummaryRequest) Default() {
}

// NewReadShareGroupStateSummaryRequest returns a default ReadShareGroupStateSummaryRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryRequest() ReadShareGroupStateSummaryRequest {
	var v ReadShareGroupStateSummaryRequest
	v.Default()
	return v
}

type ReadShareGroupStateSummaryResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// StateEpoch is the state epoch of the share-partition.
	StateEpoch int32

	// LeaderEpoch is the leader epoch of the share-partition.
	LeaderEpoch int32

	// StartOffset is the share-partition start offset.
	StartOffset int64

	// DeliveryCompleteCount is the number of offsets >= share-partition start
	// offset for which delivery has been completed. -1 if not set.
	//
	// This field has a default of -1.
	DeliveryCompleteCount int32 // v1+

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryResponseTopicPartition.
func (v *ReadShareGroupStateSummaryResponseTopicPartition) Default() {
	v.DeliveryCompleteCount = -1
}

// NewReadShareGroupStateSummaryResponseTopicPartition returns a default ReadShareGroupStateSummaryResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryResponseTopicPartition() ReadShareGroupStateSummaryResponseTopicPartition {
	var v ReadShareGroupStateSummaryResponseTopicPartition
	v.Default()
	return v
}

type ReadShareGroupStateSummaryResponseTopic struct {
	// TopicID is the topic identifier.
	TopicID [16]byte

	// Partitions are the results for the partitions.
	Partitions []ReadShareGroupStateSummaryResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryResponseTopic.
func (v *ReadShareGroupStateSummaryResponseTopic) Default() {
}

// NewReadShareGroupStateSummaryResponseTopic returns a default ReadShareGroupStateSummaryResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryResponseTopic() ReadShareGroupStateSummaryResponseTopic {
	var v ReadShareGroupStateSummaryResponseTopic
	v.Default()
	return v
}

// ReadShareGroupStateSummaryResponse is a response for a ReadShareGroupStateSummaryRequest.
//
// Supported errors:
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
// - FENCED_LEADER_EPOCH (version 0+)
// - INVALID_REQUEST (version 0+)
type ReadShareGroupStateSummaryResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Topics are the read results.
	Topics []ReadShareGroupStateSummaryResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*ReadShareGroupStateSummaryResponse) Key() int16                 { return 87 }
func (*ReadShareGroupStateSummaryResponse) MaxVersion() int16          { return 1 }
func (v *ReadShareGroupStateSummaryResponse) SetVersion(version int16) { v.Version = version }
func (v *ReadShareGroupStateSummaryResponse) GetVersion() int16        { return v.Version }
func (v *ReadShareGroupStateSummaryResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *ReadShareGroupStateSummaryResponse) RequestKind() Request {
	return &ReadShareGroupStateSummaryRequest{Version: v.Version}
}

func (v *ReadShareGroupStateSummaryResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.StateEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.LeaderEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if version >= 1 {
						v := v.DeliveryCompleteCount
						dst = kbin.AppendInt32(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *ReadShareGroupStateSummaryResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *ReadShareGroupStateSummaryResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *ReadShareGroupStateSummaryResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]ReadShareGroupStateSummaryResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]ReadShareGroupStateSummaryResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					{
						v := b.Int32()
						s.StateEpoch = v
					}
					{
						v := b.Int32()
						s.LeaderEpoch = v
					}
					{
						v := b.Int64()
						s.StartOffset = v
					}
					if version >= 1 {
						v := b.Int32()
						s.DeliveryCompleteCount = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrReadShareGroupStateSummaryResponse returns a pointer to a default ReadShareGroupStateSummaryResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrReadShareGroupStateSummaryResponse() *ReadShareGroupStateSummaryResponse {
	var v ReadShareGroupStateSummaryResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to ReadShareGroupStateSummaryResponse.
func (v *ReadShareGroupStateSummaryResponse) Default() {
}

// NewReadShareGroupStateSummaryResponse returns a default ReadShareGroupStateSummaryResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewReadShareGroupStateSummaryResponse() ReadShareGroupStateSummaryResponse {
	var v ReadShareGroupStateSummaryResponse
	v.Default()
	return v
}

// TaskIDs contains a subtopology and its partitions.
type TaskIDs struct {
	// SubtopologyID is a string that uniquely identifies the subtopology.
	SubtopologyID string

	// Partitions are the partitions of the input topics processed by this
	// member.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TaskIDs.
func (v *TaskIDs) Default() {
}

// NewTaskIDs returns a default TaskIDs
// This is a shortcut for creating a struct and calling Default yourself.
func NewTaskIDs() TaskIDs {
	var v TaskIDs
	v.Default()
	return v
}

// TopicInfo describes a topic's configuration for streams.
type TopicInfo struct {
	// Topic is the name of the topic.
	Topic string

	// NumPartitions is the number of partitions in the topic. 0 if no specific
	// number is enforced; always 0 for changelog topics.
	NumPartitions int32

	// ReplicationFactor is the replication factor of the topic. 0 if the
	// default replication factor should be used.
	ReplicationFactor int16

	// Configs are topic-level configurations as key-value pairs.
	Configs []TopicInfoConfig

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TopicInfo.
func (v *TopicInfo) Default() {
}

// NewTopicInfo returns a default TopicInfo
// This is a shortcut for creating a struct and calling Default yourself.
func NewTopicInfo() TopicInfo {
	var v TopicInfo
	v.Default()
	return v
}

// Endpoint describes a host:port endpoint.
type Endpoint struct {
	// Host is the hostname.
	Host string

	// Port is the port.
	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to Endpoint.
func (v *Endpoint) Default() {
}

// NewEndpoint returns a default Endpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewEndpoint() Endpoint {
	var v Endpoint
	v.Default()
	return v
}

// TaskOffset describes a changelog offset for a task.
type TaskOffset struct {
	// SubtopologyID is the subtopology identifier.
	SubtopologyID string

	// Partition is the partition.
	Partition int32

	// Offset is the offset.
	Offset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to TaskOffset.
func (v *TaskOffset) Default() {
}

// NewTaskOffset returns a default TaskOffset
// This is a shortcut for creating a struct and calling Default yourself.
func NewTaskOffset() TaskOffset {
	var v TaskOffset
	v.Default()
	return v
}

type StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup struct {
	// SourceTopics are indexes into the subtopology's SourceTopics array.
	SourceTopics []int16

	// SourceTopicRegex are indexes into the subtopology's SourceTopicRegex
	// array.
	SourceTopicRegex []int16

	// RepartitionSourceTopics are indexes into the subtopology's
	// RepartitionSourceTopics array.
	RepartitionSourceTopics []int16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup.
func (v *StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup) Default() {
}

// NewStreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup returns a default StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup() StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup {
	var v StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup
	v.Default()
	return v
}

type StreamsGroupHeartbeatRequestTopologySubtopology struct {
	// SubtopologyID uniquely identifies the subtopology.
	SubtopologyID string

	// SourceTopics are the topics the topology reads from.
	SourceTopics []string

	// SourceTopicRegex are regular expressions identifying topics the
	// subtopology reads from.
	SourceTopicRegex []string

	// StateChangelogTopics are changelog topics associated with this
	// subtopology, created automatically.
	StateChangelogTopics []TopicInfo

	// RepartitionSinkTopics are the repartition topics the subtopology
	// writes to.
	RepartitionSinkTopics []string

	// RepartitionSourceTopics are source topics that are internally created
	// repartition topics, created automatically.
	RepartitionSourceTopics []TopicInfo

	// CopartitionGroups are subsets of source topics that must be
	// copartitioned.
	CopartitionGroups []StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequestTopologySubtopology.
func (v *StreamsGroupHeartbeatRequestTopologySubtopology) Default() {
}

// NewStreamsGroupHeartbeatRequestTopologySubtopology returns a default StreamsGroupHeartbeatRequestTopologySubtopology
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequestTopologySubtopology() StreamsGroupHeartbeatRequestTopologySubtopology {
	var v StreamsGroupHeartbeatRequestTopologySubtopology
	v.Default()
	return v
}

type StreamsGroupHeartbeatRequestTopology struct {
	// Epoch is the epoch of the topology.
	Epoch int32

	// Subtopologies are the sub-topologies of the streams application.
	Subtopologies []StreamsGroupHeartbeatRequestTopologySubtopology

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequestTopology.
func (v *StreamsGroupHeartbeatRequestTopology) Default() {
}

// NewStreamsGroupHeartbeatRequestTopology returns a default StreamsGroupHeartbeatRequestTopology
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequestTopology() StreamsGroupHeartbeatRequestTopology {
	var v StreamsGroupHeartbeatRequestTopology
	v.Default()
	return v
}

type StreamsGroupHeartbeatRequestUserEndpoint struct {
	// Host is the hostname.
	Host string

	// Port is the port.
	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequestUserEndpoint.
func (v *StreamsGroupHeartbeatRequestUserEndpoint) Default() {
}

// NewStreamsGroupHeartbeatRequestUserEndpoint returns a default StreamsGroupHeartbeatRequestUserEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequestUserEndpoint() StreamsGroupHeartbeatRequestUserEndpoint {
	var v StreamsGroupHeartbeatRequestUserEndpoint
	v.Default()
	return v
}

type StreamsGroupHeartbeatRequestClientTag struct {
	// Key is the tag key.
	Key string

	// Value is the tag value.
	Value string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequestClientTag.
func (v *StreamsGroupHeartbeatRequestClientTag) Default() {
}

// NewStreamsGroupHeartbeatRequestClientTag returns a default StreamsGroupHeartbeatRequestClientTag
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequestClientTag() StreamsGroupHeartbeatRequestClientTag {
	var v StreamsGroupHeartbeatRequestClientTag
	v.Default()
	return v
}

// StreamsGroupHeartbeatRequest is a part of KIP-1071; documentation is left
// to the KIP itself for brevity.
type StreamsGroupHeartbeatRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Group is the group identifier.
	Group string

	// MemberID is the member ID generated by the streams consumer. Must be
	// kept during the entire lifetime of the streams consumer process.
	MemberID string

	// MemberEpoch is the current member epoch; 0 to join the group; -1 to
	// leave the group; -2 to indicate that the static member will rejoin.
	MemberEpoch int32

	// EndpointInformationEpoch is the current endpoint epoch of this client,
	// represents the latest endpoint epoch this client received.
	EndpointInformationEpoch int32

	// InstanceID is the instance ID for static membership; null if not provided
	// or if unchanged since the last heartbeat.
	InstanceID *string

	// RackID is the rack ID of the member; null if not provided or if unchanged
	// since the last heartbeat.
	RackID *string

	// RebalanceTimeoutMillis is the maximum time in milliseconds that the
	// coordinator will wait on the member to revoke its tasks. -1 if unchanged
	// since last heartbeat.
	//
	// This field has a default of -1.
	RebalanceTimeoutMillis int32

	// Topology is the topology metadata of the streams application. Only sent
	// when memberEpoch = 0. Null otherwise.
	Topology *StreamsGroupHeartbeatRequestTopology

	// ActiveTasks are the currently owned active tasks. Null if unchanged since
	// last heartbeat.
	ActiveTasks []TaskIDs

	// StandbyTasks are the currently owned standby tasks. Null if unchanged
	// since last heartbeat.
	StandbyTasks []TaskIDs

	// WarmupTasks are the currently owned warm-up tasks. Null if unchanged
	// since last heartbeat.
	WarmupTasks []TaskIDs

	// ProcessID is the identity of the streams instance that may have multiple
	// consumers. Null if unchanged since last heartbeat.
	ProcessID *string

	// UserEndpoint is the user-defined endpoint for Interactive Queries. Null
	// if unchanged since last heartbeat or if not defined on the client.
	UserEndpoint *StreamsGroupHeartbeatRequestUserEndpoint

	// ClientTags are used for rack-aware assignment. Null if unchanged since
	// last heartbeat.
	ClientTags []StreamsGroupHeartbeatRequestClientTag

	// TaskOffsets are cumulative changelog offsets for tasks. Null if unchanged
	// since last heartbeat.
	TaskOffsets []TaskOffset

	// TaskEndOffsets are cumulative changelog end-offsets for tasks. Null if
	// unchanged since last heartbeat.
	TaskEndOffsets []TaskOffset

	// ShutdownApplication indicates whether all Streams clients in the group
	// should shut down.
	ShutdownApplication bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*StreamsGroupHeartbeatRequest) Key() int16                   { return 88 }
func (*StreamsGroupHeartbeatRequest) MaxVersion() int16            { return 0 }
func (v *StreamsGroupHeartbeatRequest) SetVersion(version int16)   { v.Version = version }
func (v *StreamsGroupHeartbeatRequest) GetVersion() int16          { return v.Version }
func (v *StreamsGroupHeartbeatRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *StreamsGroupHeartbeatRequest) IsGroupCoordinatorRequest() {}
func (v *StreamsGroupHeartbeatRequest) ResponseKind() Response {
	r := &StreamsGroupHeartbeatResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *StreamsGroupHeartbeatRequest) RequestWith(ctx context.Context, r Requestor) (*StreamsGroupHeartbeatResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*StreamsGroupHeartbeatResponse)
	return resp, err
}

func (v *StreamsGroupHeartbeatRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Group
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.EndpointInformationEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.InstanceID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.RackID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.RebalanceTimeoutMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Topology
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.Epoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Subtopologies
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.SubtopologyID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.SourceTopics
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
					}
					{
						v := v.SourceTopicRegex
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
					}
					{
						v := v.StateChangelogTopics
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Topic
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.NumPartitions
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ReplicationFactor
								dst = kbin.AppendInt16(dst, v)
							}
							{
								v := v.Configs
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := &v[i]
									{
										v := v.Key
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									{
										v := v.Value
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.RepartitionSinkTopics
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							if isFlexible {
								dst = kbin.AppendCompactString(dst, v)
							} else {
								dst = kbin.AppendString(dst, v)
							}
						}
					}
					{
						v := v.RepartitionSourceTopics
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Topic
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.NumPartitions
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.ReplicationFactor
								dst = kbin.AppendInt16(dst, v)
							}
							{
								v := v.Configs
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := &v[i]
									{
										v := v.Key
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									{
										v := v.Value
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.CopartitionGroups
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.SourceTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									dst = kbin.AppendInt16(dst, v)
								}
							}
							{
								v := v.SourceTopicRegex
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									dst = kbin.AppendInt16(dst, v)
								}
							}
							{
								v := v.RepartitionSourceTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									dst = kbin.AppendInt16(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ActiveTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.StandbyTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.WarmupTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ProcessID
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.UserEndpoint
		if v == nil {
			dst = append(dst, 255)
		} else {
			dst = append(dst, 1)
			{
				v := v.Host
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Port
				dst = kbin.AppendUint16(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ClientTags
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Key
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Value
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TaskOffsets
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Offset
				dst = kbin.AppendInt64(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.TaskEndOffsets
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partition
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Offset
				dst = kbin.AppendInt64(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ShutdownApplication
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StreamsGroupHeartbeatRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StreamsGroupHeartbeatRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StreamsGroupHeartbeatRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.Group = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		v := b.Int32()
		s.EndpointInformationEpoch = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.InstanceID = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.RackID = v
	}
	{
		v := b.Int32()
		s.RebalanceTimeoutMillis = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.Topology = new(StreamsGroupHeartbeatRequestTopology)
			v := s.Topology
			v.Default()
			s := v
			{
				v := b.Int32()
				s.Epoch = v
			}
			{
				v := s.Subtopologies
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]StreamsGroupHeartbeatRequestTopologySubtopology, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.SubtopologyID = v
					}
					{
						v := s.SourceTopics
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]string, l)...)
						}
						for i := int32(0); i < l; i++ {
							var v string
							if unsafe {
								if isFlexible {
									v = b.UnsafeCompactString()
								} else {
									v = b.UnsafeString()
								}
							} else {
								if isFlexible {
									v = b.CompactString()
								} else {
									v = b.String()
								}
							}
							a[i] = v
						}
						v = a
						s.SourceTopics = v
					}
					{
						v := s.SourceTopicRegex
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]string, l)...)
						}
						for i := int32(0); i < l; i++ {
							var v string
							if unsafe {
								if isFlexible {
									v = b.UnsafeCompactString()
								} else {
									v = b.UnsafeString()
								}
							} else {
								if isFlexible {
									v = b.CompactString()
								} else {
									v = b.String()
								}
							}
							a[i] = v
						}
						v = a
						s.SourceTopicRegex = v
					}
					{
						v := s.StateChangelogTopics
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]TopicInfo, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Topic = v
							}
							{
								v := b.Int32()
								s.NumPartitions = v
							}
							{
								v := b.Int16()
								s.ReplicationFactor = v
							}
							{
								v := s.Configs
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]TopicInfoConfig, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := &a[i]
									v.Default()
									s := v
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Key = v
									}
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Value = v
									}
									if isFlexible {
										s.UnknownTags = internalReadTags(&b)
									}
								}
								v = a
								s.Configs = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.StateChangelogTopics = v
					}
					{
						v := s.RepartitionSinkTopics
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]string, l)...)
						}
						for i := int32(0); i < l; i++ {
							var v string
							if unsafe {
								if isFlexible {
									v = b.UnsafeCompactString()
								} else {
									v = b.UnsafeString()
								}
							} else {
								if isFlexible {
									v = b.CompactString()
								} else {
									v = b.String()
								}
							}
							a[i] = v
						}
						v = a
						s.RepartitionSinkTopics = v
					}
					{
						v := s.RepartitionSourceTopics
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]TopicInfo, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Topic = v
							}
							{
								v := b.Int32()
								s.NumPartitions = v
							}
							{
								v := b.Int16()
								s.ReplicationFactor = v
							}
							{
								v := s.Configs
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]TopicInfoConfig, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := &a[i]
									v.Default()
									s := v
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Key = v
									}
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Value = v
									}
									if isFlexible {
										s.UnknownTags = internalReadTags(&b)
									}
								}
								v = a
								s.Configs = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.RepartitionSourceTopics = v
					}
					{
						v := s.CopartitionGroups
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]StreamsGroupHeartbeatRequestTopologySubtopologyCopartitionGroup, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := s.SourceTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]int16, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := b.Int16()
									a[i] = v
								}
								v = a
								s.SourceTopics = v
							}
							{
								v := s.SourceTopicRegex
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]int16, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := b.Int16()
									a[i] = v
								}
								v = a
								s.SourceTopicRegex = v
							}
							{
								v := s.RepartitionSourceTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]int16, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := b.Int16()
									a[i] = v
								}
								v = a
								s.RepartitionSourceTopics = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.CopartitionGroups = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Subtopologies = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	{
		v := s.ActiveTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ActiveTasks = v
	}
	{
		v := s.StandbyTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.StandbyTasks = v
	}
	{
		v := s.WarmupTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.WarmupTasks = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ProcessID = v
	}
	{
		if present := b.Int8(); present != -1 && b.Ok() {
			s.UserEndpoint = new(StreamsGroupHeartbeatRequestUserEndpoint)
			v := s.UserEndpoint
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Host = v
			}
			{
				v := b.Uint16()
				s.Port = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
	}
	{
		v := s.ClientTags
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []StreamsGroupHeartbeatRequestClientTag{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StreamsGroupHeartbeatRequestClientTag, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Key = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Value = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ClientTags = v
	}
	{
		v := s.TaskOffsets
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskOffset{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskOffset, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int64()
				s.Offset = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TaskOffsets = v
	}
	{
		v := s.TaskEndOffsets
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskOffset{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskOffset, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := b.Int32()
				s.Partition = v
			}
			{
				v := b.Int64()
				s.Offset = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.TaskEndOffsets = v
	}
	{
		v := b.Bool()
		s.ShutdownApplication = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStreamsGroupHeartbeatRequest returns a pointer to a default StreamsGroupHeartbeatRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStreamsGroupHeartbeatRequest() *StreamsGroupHeartbeatRequest {
	var v StreamsGroupHeartbeatRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatRequest.
func (v *StreamsGroupHeartbeatRequest) Default() {
	v.RebalanceTimeoutMillis = -1
	{
		v := &v.Topology
		_ = v
	}
	{
		v := &v.UserEndpoint
		_ = v
	}
}

// NewStreamsGroupHeartbeatRequest returns a default StreamsGroupHeartbeatRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatRequest() StreamsGroupHeartbeatRequest {
	var v StreamsGroupHeartbeatRequest
	v.Default()
	return v
}

type StreamsGroupHeartbeatResponseStatus struct {
	// StatusCode indicates a particular status; 0:STALE_TOPOLOGY,
	// 1:MISSING_SOURCE_TOPICS, 2:INCORRECTLY_PARTITIONED_TOPICS,
	// 3:MISSING_INTERNAL_TOPICS, 4:SHUTDOWN_APPLICATION,
	// 5:ASSIGNMENT_DELAYED.
	StatusCode int8

	// StatusDetail is a string representation of the status.
	StatusDetail string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatResponseStatus.
func (v *StreamsGroupHeartbeatResponseStatus) Default() {
}

// NewStreamsGroupHeartbeatResponseStatus returns a default StreamsGroupHeartbeatResponseStatus
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatResponseStatus() StreamsGroupHeartbeatResponseStatus {
	var v StreamsGroupHeartbeatResponseStatus
	v.Default()
	return v
}

type StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition struct {
	// Topic is the topic name.
	Topic string

	// Partitions are the partitions.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition.
func (v *StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition) Default() {
}

// NewStreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition returns a default StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition() StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition {
	var v StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition
	v.Default()
	return v
}

type StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition struct {
	// Topic is the topic name.
	Topic string

	// Partitions are the partitions.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition.
func (v *StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition) Default() {
}

// NewStreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition returns a default StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition() StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition {
	var v StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition
	v.Default()
	return v
}

type StreamsGroupHeartbeatResponsePartitionsByUserEndpoint struct {
	// UserEndpoint is the user-defined endpoint to connect to the node.
	UserEndpoint Endpoint

	// ActivePartitions are all topic partitions materialized by active tasks
	// on the node.
	ActivePartitions []StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition

	// StandbyPartitions are all topic partitions materialized by standby
	// tasks on the node.
	StandbyPartitions []StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatResponsePartitionsByUserEndpoint.
func (v *StreamsGroupHeartbeatResponsePartitionsByUserEndpoint) Default() {
	{
		v := &v.UserEndpoint
		_ = v
	}
}

// NewStreamsGroupHeartbeatResponsePartitionsByUserEndpoint returns a default StreamsGroupHeartbeatResponsePartitionsByUserEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatResponsePartitionsByUserEndpoint() StreamsGroupHeartbeatResponsePartitionsByUserEndpoint {
	var v StreamsGroupHeartbeatResponsePartitionsByUserEndpoint
	v.Default()
	return v
}

// StreamsGroupHeartbeatResponse is returned from a StreamsGroupHeartbeatRequest.
type StreamsGroupHeartbeatResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the top-level error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// MemberID is the member ID.
	MemberID string

	// MemberEpoch is the member epoch.
	MemberEpoch int32

	// HeartbeatIntervalMillis is the heartbeat interval in milliseconds.
	HeartbeatIntervalMillis int32

	// AcceptableRecoveryLag is the maximal lag a warm-up task can have to be
	// considered caught-up.
	AcceptableRecoveryLag int32

	// TaskOffsetIntervalMillis is the interval in which the task changelog
	// offsets on a client are updated on the broker.
	TaskOffsetIntervalMillis int32

	// Status indicates zero or more statuses for the group membership.
	Status []StreamsGroupHeartbeatResponseStatus

	// ActiveTasks are assigned active tasks. Null if unchanged since last
	// heartbeat.
	ActiveTasks []TaskIDs

	// StandbyTasks are assigned standby tasks. Null if unchanged since last
	// heartbeat.
	StandbyTasks []TaskIDs

	// WarmupTasks are assigned warm-up tasks. Null if unchanged since last
	// heartbeat.
	WarmupTasks []TaskIDs

	// EndpointInformationEpoch is the endpoint epoch set in the response.
	EndpointInformationEpoch int32

	// PartitionsByUserEndpoint is global assignment information used for
	// Interactive Queries. Null if unchanged since last heartbeat.
	PartitionsByUserEndpoint []StreamsGroupHeartbeatResponsePartitionsByUserEndpoint

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*StreamsGroupHeartbeatResponse) Key() int16                 { return 88 }
func (*StreamsGroupHeartbeatResponse) MaxVersion() int16          { return 0 }
func (v *StreamsGroupHeartbeatResponse) SetVersion(version int16) { v.Version = version }
func (v *StreamsGroupHeartbeatResponse) GetVersion() int16        { return v.Version }
func (v *StreamsGroupHeartbeatResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *StreamsGroupHeartbeatResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *StreamsGroupHeartbeatResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *StreamsGroupHeartbeatResponse) RequestKind() Request {
	return &StreamsGroupHeartbeatRequest{Version: v.Version}
}

func (v *StreamsGroupHeartbeatResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.MemberID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.MemberEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.HeartbeatIntervalMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.AcceptableRecoveryLag
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.TaskOffsetIntervalMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Status
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.StatusCode
				dst = kbin.AppendInt8(dst, v)
			}
			{
				v := v.StatusDetail
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.ActiveTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.StandbyTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.WarmupTasks
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := v.SubtopologyID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := v[i]
					dst = kbin.AppendInt32(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	{
		v := v.EndpointInformationEpoch
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.PartitionsByUserEndpoint
		if isFlexible {
			dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
		} else {
			dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
		}
		for i := range v {
			v := &v[i]
			{
				v := &v.UserEndpoint
				{
					v := v.Host
					if isFlexible {
						dst = kbin.AppendCompactString(dst, v)
					} else {
						dst = kbin.AppendString(dst, v)
					}
				}
				{
					v := v.Port
					dst = kbin.AppendUint16(dst, v)
				}
				if isFlexible {
					dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
					dst = v.UnknownTags.AppendEach(dst)
				}
			}
			{
				v := v.ActivePartitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.StandbyPartitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StreamsGroupHeartbeatResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StreamsGroupHeartbeatResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StreamsGroupHeartbeatResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.MemberID = v
	}
	{
		v := b.Int32()
		s.MemberEpoch = v
	}
	{
		v := b.Int32()
		s.HeartbeatIntervalMillis = v
	}
	{
		v := b.Int32()
		s.AcceptableRecoveryLag = v
	}
	{
		v := b.Int32()
		s.TaskOffsetIntervalMillis = v
	}
	{
		v := s.Status
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []StreamsGroupHeartbeatResponseStatus{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StreamsGroupHeartbeatResponseStatus, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int8()
				s.StatusCode = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.StatusDetail = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Status = v
	}
	{
		v := s.ActiveTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.ActiveTasks = v
	}
	{
		v := s.StandbyTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.StandbyTasks = v
	}
	{
		v := s.WarmupTasks
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []TaskIDs{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]TaskIDs, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.SubtopologyID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]int32, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := b.Int32()
					a[i] = v
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.WarmupTasks = v
	}
	{
		v := b.Int32()
		s.EndpointInformationEpoch = v
	}
	{
		v := s.PartitionsByUserEndpoint
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if version < 0 || l == 0 {
			a = []StreamsGroupHeartbeatResponsePartitionsByUserEndpoint{}
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StreamsGroupHeartbeatResponsePartitionsByUserEndpoint, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := &s.UserEndpoint
				v.Default()
				s := v
				{
					var v string
					if unsafe {
						if isFlexible {
							v = b.UnsafeCompactString()
						} else {
							v = b.UnsafeString()
						}
					} else {
						if isFlexible {
							v = b.CompactString()
						} else {
							v = b.String()
						}
					}
					s.Host = v
				}
				{
					v := b.Uint16()
					s.Port = v
				}
				if isFlexible {
					s.UnknownTags = internalReadTags(&b)
				}
			}
			{
				v := s.ActivePartitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]StreamsGroupHeartbeatResponsePartitionsByUserEndpointActivePartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.ActivePartitions = v
			}
			{
				v := s.StandbyPartitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]StreamsGroupHeartbeatResponsePartitionsByUserEndpointStandbyPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.StandbyPartitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.PartitionsByUserEndpoint = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStreamsGroupHeartbeatResponse returns a pointer to a default StreamsGroupHeartbeatResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStreamsGroupHeartbeatResponse() *StreamsGroupHeartbeatResponse {
	var v StreamsGroupHeartbeatResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupHeartbeatResponse.
func (v *StreamsGroupHeartbeatResponse) Default() {
}

// NewStreamsGroupHeartbeatResponse returns a default StreamsGroupHeartbeatResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupHeartbeatResponse() StreamsGroupHeartbeatResponse {
	var v StreamsGroupHeartbeatResponse
	v.Default()
	return v
}

// StreamsAssignment contains streams group task assignments.
type StreamsAssignment struct {
	// ActiveTasks are active tasks for this client.
	ActiveTasks []TaskIDs

	// StandbyTasks are standby tasks for this client.
	StandbyTasks []TaskIDs

	// WarmupTasks are warm-up tasks for this client.
	WarmupTasks []TaskIDs

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsAssignment.
func (v *StreamsAssignment) Default() {
}

// NewStreamsAssignment returns a default StreamsAssignment
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsAssignment() StreamsAssignment {
	var v StreamsAssignment
	v.Default()
	return v
}

// StreamsGroupDescribeRequest describes one or more streams groups. This is
// part of KIP-1071.
type StreamsGroupDescribeRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Groups are the IDs of the groups to describe.
	Groups []string

	// IncludeAuthorizedOperations controls whether to include authorized
	// operations.
	IncludeAuthorizedOperations bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*StreamsGroupDescribeRequest) Key() int16                 { return 89 }
func (*StreamsGroupDescribeRequest) MaxVersion() int16          { return 0 }
func (v *StreamsGroupDescribeRequest) SetVersion(version int16) { v.Version = version }
func (v *StreamsGroupDescribeRequest) GetVersion() int16        { return v.Version }
func (v *StreamsGroupDescribeRequest) IsFlexible() bool         { return v.Version >= 0 }
func (v *StreamsGroupDescribeRequest) ResponseKind() Response {
	r := &StreamsGroupDescribeResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *StreamsGroupDescribeRequest) RequestWith(ctx context.Context, r Requestor) (*StreamsGroupDescribeResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*StreamsGroupDescribeResponse)
	return resp, err
}

func (v *StreamsGroupDescribeRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := v[i]
			if isFlexible {
				dst = kbin.AppendCompactString(dst, v)
			} else {
				dst = kbin.AppendString(dst, v)
			}
		}
	}
	{
		v := v.IncludeAuthorizedOperations
		dst = kbin.AppendBool(dst, v)
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StreamsGroupDescribeRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StreamsGroupDescribeRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StreamsGroupDescribeRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]string, l)...)
		}
		for i := int32(0); i < l; i++ {
			var v string
			if unsafe {
				if isFlexible {
					v = b.UnsafeCompactString()
				} else {
					v = b.UnsafeString()
				}
			} else {
				if isFlexible {
					v = b.CompactString()
				} else {
					v = b.String()
				}
			}
			a[i] = v
		}
		v = a
		s.Groups = v
	}
	{
		v := b.Bool()
		s.IncludeAuthorizedOperations = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStreamsGroupDescribeRequest returns a pointer to a default StreamsGroupDescribeRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStreamsGroupDescribeRequest() *StreamsGroupDescribeRequest {
	var v StreamsGroupDescribeRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeRequest.
func (v *StreamsGroupDescribeRequest) Default() {
}

// NewStreamsGroupDescribeRequest returns a default StreamsGroupDescribeRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeRequest() StreamsGroupDescribeRequest {
	var v StreamsGroupDescribeRequest
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroupTopologySubtopology struct {
	// SubtopologyID uniquely identifies the subtopology.
	SubtopologyID string

	// SourceTopics are the topics the subtopology reads from.
	SourceTopics []string

	// RepartitionSinkTopics are the repartition topics the subtopology
	// writes to.
	RepartitionSinkTopics []string

	// StateChangelogTopics are changelog topics associated with this
	// subtopology.
	StateChangelogTopics []TopicInfo

	// RepartitionSourceTopics are source topics that are internally
	// created repartition topics.
	RepartitionSourceTopics []TopicInfo

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroupTopologySubtopology.
func (v *StreamsGroupDescribeResponseGroupTopologySubtopology) Default() {
}

// NewStreamsGroupDescribeResponseGroupTopologySubtopology returns a default StreamsGroupDescribeResponseGroupTopologySubtopology
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroupTopologySubtopology() StreamsGroupDescribeResponseGroupTopologySubtopology {
	var v StreamsGroupDescribeResponseGroupTopologySubtopology
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroupTopology struct {
	// Epoch is the epoch of the currently initialized topology.
	Epoch int32

	// Subtopologies are the subtopologies of the streams application. Null
	// if the group is uninitialized, source topics are missing, or
	// incorrectly partitioned.
	Subtopologies []StreamsGroupDescribeResponseGroupTopologySubtopology

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroupTopology.
func (v *StreamsGroupDescribeResponseGroupTopology) Default() {
}

// NewStreamsGroupDescribeResponseGroupTopology returns a default StreamsGroupDescribeResponseGroupTopology
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroupTopology() StreamsGroupDescribeResponseGroupTopology {
	var v StreamsGroupDescribeResponseGroupTopology
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroupMemberUserEndpoint struct {
	// Host is the hostname.
	Host string

	// Port is the port.
	Port uint16

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroupMemberUserEndpoint.
func (v *StreamsGroupDescribeResponseGroupMemberUserEndpoint) Default() {
}

// NewStreamsGroupDescribeResponseGroupMemberUserEndpoint returns a default StreamsGroupDescribeResponseGroupMemberUserEndpoint
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroupMemberUserEndpoint() StreamsGroupDescribeResponseGroupMemberUserEndpoint {
	var v StreamsGroupDescribeResponseGroupMemberUserEndpoint
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroupMemberClientTag struct {
	// Key is the tag key.
	Key string

	// Value is the tag value.
	Value string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroupMemberClientTag.
func (v *StreamsGroupDescribeResponseGroupMemberClientTag) Default() {
}

// NewStreamsGroupDescribeResponseGroupMemberClientTag returns a default StreamsGroupDescribeResponseGroupMemberClientTag
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroupMemberClientTag() StreamsGroupDescribeResponseGroupMemberClientTag {
	var v StreamsGroupDescribeResponseGroupMemberClientTag
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroupMember struct {
	// MemberID is the member ID.
	MemberID string

	// MemberEpoch is the member epoch.
	MemberEpoch int32

	// InstanceID is the member instance ID for static membership.
	InstanceID *string

	// RackID is the rack ID.
	RackID *string

	// ClientID is the client ID.
	ClientID string

	// ClientHost is the client host.
	ClientHost string

	// TopologyEpoch is the epoch of the topology on the client.
	TopologyEpoch int32

	// ProcessID is the identity of the streams instance that may have
	// multiple clients.
	ProcessID string

	// UserEndpoint is the user-defined endpoint for Interactive Queries.
	// Null if not defined for this client.
	UserEndpoint *StreamsGroupDescribeResponseGroupMemberUserEndpoint

	// ClientTags are used for rack-aware assignment.
	ClientTags []StreamsGroupDescribeResponseGroupMemberClientTag

	// TaskOffsets are cumulative changelog offsets for tasks.
	TaskOffsets []TaskOffset

	// TaskEndOffsets are cumulative changelog end offsets for tasks.
	TaskEndOffsets []TaskOffset

	// Assignment is the current assignment.
	Assignment StreamsAssignment

	// TargetAssignment is the target assignment.
	TargetAssignment StreamsAssignment

	// IsClassic is true for classic members that have not been upgraded yet.
	IsClassic bool

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroupMember.
func (v *StreamsGroupDescribeResponseGroupMember) Default() {
	{
		v := &v.UserEndpoint
		_ = v
	}
	{
		v := &v.Assignment
		_ = v
	}
	{
		v := &v.TargetAssignment
		_ = v
	}
}

// NewStreamsGroupDescribeResponseGroupMember returns a default StreamsGroupDescribeResponseGroupMember
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroupMember() StreamsGroupDescribeResponseGroupMember {
	var v StreamsGroupDescribeResponseGroupMember
	v.Default()
	return v
}

type StreamsGroupDescribeResponseGroup struct {
	// ErrorCode is the describe error, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// Group is the group ID.
	Group string

	// State is the group state.
	State string

	// Epoch is the group epoch.
	Epoch int32

	// AssignmentEpoch is the assignment epoch.
	AssignmentEpoch int32

	// Topology is the topology metadata currently initialized for the streams
	// application. Null in case of a describe error.
	Topology *StreamsGroupDescribeResponseGroupTopology

	// Members are the members of the group.
	Members []StreamsGroupDescribeResponseGroupMember

	// AuthorizedOperations is a 32-bit bitfield representing authorized
	// operations for the group.
	//
	// This field has a default of -2147483648.
	AuthorizedOperations int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponseGroup.
func (v *StreamsGroupDescribeResponseGroup) Default() {
	{
		v := &v.Topology
		_ = v
	}
	v.AuthorizedOperations = -2147483648
}

// NewStreamsGroupDescribeResponseGroup returns a default StreamsGroupDescribeResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponseGroup() StreamsGroupDescribeResponseGroup {
	var v StreamsGroupDescribeResponseGroup
	v.Default()
	return v
}

// StreamsGroupDescribeResponse is returned from a StreamsGroupDescribeRequest.
type StreamsGroupDescribeResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Groups contains each described group.
	Groups []StreamsGroupDescribeResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*StreamsGroupDescribeResponse) Key() int16                 { return 89 }
func (*StreamsGroupDescribeResponse) MaxVersion() int16          { return 0 }
func (v *StreamsGroupDescribeResponse) SetVersion(version int16) { v.Version = version }
func (v *StreamsGroupDescribeResponse) GetVersion() int16        { return v.Version }
func (v *StreamsGroupDescribeResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *StreamsGroupDescribeResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *StreamsGroupDescribeResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *StreamsGroupDescribeResponse) RequestKind() Request {
	return &StreamsGroupDescribeRequest{Version: v.Version}
}

func (v *StreamsGroupDescribeResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			{
				v := v.Group
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.State
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Epoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.AssignmentEpoch
				dst = kbin.AppendInt32(dst, v)
			}
			{
				v := v.Topology
				if v == nil {
					dst = append(dst, 255)
				} else {
					dst = append(dst, 1)
					{
						v := v.Epoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.Subtopologies
						if isFlexible {
							dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
						} else {
							dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
						}
						for i := range v {
							v := &v[i]
							{
								v := v.SubtopologyID
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.SourceTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
							}
							{
								v := v.RepartitionSinkTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := v[i]
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
							}
							{
								v := v.StateChangelogTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := &v[i]
									{
										v := v.Topic
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									{
										v := v.NumPartitions
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.ReplicationFactor
										dst = kbin.AppendInt16(dst, v)
									}
									{
										v := v.Configs
										if isFlexible {
											dst = kbin.AppendCompactArrayLen(dst, len(v))
										} else {
											dst = kbin.AppendArrayLen(dst, len(v))
										}
										for i := range v {
											v := &v[i]
											{
												v := v.Key
												if isFlexible {
													dst = kbin.AppendCompactString(dst, v)
												} else {
													dst = kbin.AppendString(dst, v)
												}
											}
											{
												v := v.Value
												if isFlexible {
													dst = kbin.AppendCompactString(dst, v)
												} else {
													dst = kbin.AppendString(dst, v)
												}
											}
											if isFlexible {
												dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
												dst = v.UnknownTags.AppendEach(dst)
											}
										}
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
								}
							}
							{
								v := v.RepartitionSourceTopics
								if isFlexible {
									dst = kbin.AppendCompactArrayLen(dst, len(v))
								} else {
									dst = kbin.AppendArrayLen(dst, len(v))
								}
								for i := range v {
									v := &v[i]
									{
										v := v.Topic
										if isFlexible {
											dst = kbin.AppendCompactString(dst, v)
										} else {
											dst = kbin.AppendString(dst, v)
										}
									}
									{
										v := v.NumPartitions
										dst = kbin.AppendInt32(dst, v)
									}
									{
										v := v.ReplicationFactor
										dst = kbin.AppendInt16(dst, v)
									}
									{
										v := v.Configs
										if isFlexible {
											dst = kbin.AppendCompactArrayLen(dst, len(v))
										} else {
											dst = kbin.AppendArrayLen(dst, len(v))
										}
										for i := range v {
											v := &v[i]
											{
												v := v.Key
												if isFlexible {
													dst = kbin.AppendCompactString(dst, v)
												} else {
													dst = kbin.AppendString(dst, v)
												}
											}
											{
												v := v.Value
												if isFlexible {
													dst = kbin.AppendCompactString(dst, v)
												} else {
													dst = kbin.AppendString(dst, v)
												}
											}
											if isFlexible {
												dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
												dst = v.UnknownTags.AppendEach(dst)
											}
										}
									}
									if isFlexible {
										dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
										dst = v.UnknownTags.AppendEach(dst)
									}
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.Members
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.MemberID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.MemberEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.InstanceID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.RackID
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					{
						v := v.ClientID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.ClientHost
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.TopologyEpoch
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ProcessID
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.UserEndpoint
						if v == nil {
							dst = append(dst, 255)
						} else {
							dst = append(dst, 1)
							{
								v := v.Host
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.Port
								dst = kbin.AppendUint16(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.ClientTags
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Key
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.Value
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.TaskOffsets
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.SubtopologyID
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.Offset
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := v.TaskEndOffsets
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.SubtopologyID
								if isFlexible {
									dst = kbin.AppendCompactString(dst, v)
								} else {
									dst = kbin.AppendString(dst, v)
								}
							}
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.Offset
								dst = kbin.AppendInt64(dst, v)
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					{
						v := &v.Assignment
						{
							v := v.ActiveTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						{
							v := v.StandbyTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						{
							v := v.WarmupTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := &v.TargetAssignment
						{
							v := v.ActiveTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						{
							v := v.StandbyTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						{
							v := v.WarmupTasks
							if isFlexible {
								dst = kbin.AppendCompactArrayLen(dst, len(v))
							} else {
								dst = kbin.AppendArrayLen(dst, len(v))
							}
							for i := range v {
								v := &v[i]
								{
									v := v.SubtopologyID
									if isFlexible {
										dst = kbin.AppendCompactString(dst, v)
									} else {
										dst = kbin.AppendString(dst, v)
									}
								}
								{
									v := v.Partitions
									if isFlexible {
										dst = kbin.AppendCompactArrayLen(dst, len(v))
									} else {
										dst = kbin.AppendArrayLen(dst, len(v))
									}
									for i := range v {
										v := v[i]
										dst = kbin.AppendInt32(dst, v)
									}
								}
								if isFlexible {
									dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
									dst = v.UnknownTags.AppendEach(dst)
								}
							}
						}
						if isFlexible {
							dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
							dst = v.UnknownTags.AppendEach(dst)
						}
					}
					{
						v := v.IsClassic
						dst = kbin.AppendBool(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.AuthorizedOperations
				dst = kbin.AppendInt32(dst, v)
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *StreamsGroupDescribeResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *StreamsGroupDescribeResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *StreamsGroupDescribeResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]StreamsGroupDescribeResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Group = v
			}
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.State = v
			}
			{
				v := b.Int32()
				s.Epoch = v
			}
			{
				v := b.Int32()
				s.AssignmentEpoch = v
			}
			{
				if present := b.Int8(); present != -1 && b.Ok() {
					s.Topology = new(StreamsGroupDescribeResponseGroupTopology)
					v := s.Topology
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Epoch = v
					}
					{
						v := s.Subtopologies
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if version < 0 || l == 0 {
							a = []StreamsGroupDescribeResponseGroupTopologySubtopology{}
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]StreamsGroupDescribeResponseGroupTopologySubtopology, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.SubtopologyID = v
							}
							{
								v := s.SourceTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]string, l)...)
								}
								for i := int32(0); i < l; i++ {
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									a[i] = v
								}
								v = a
								s.SourceTopics = v
							}
							{
								v := s.RepartitionSinkTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]string, l)...)
								}
								for i := int32(0); i < l; i++ {
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									a[i] = v
								}
								v = a
								s.RepartitionSinkTopics = v
							}
							{
								v := s.StateChangelogTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]TopicInfo, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := &a[i]
									v.Default()
									s := v
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Topic = v
									}
									{
										v := b.Int32()
										s.NumPartitions = v
									}
									{
										v := b.Int16()
										s.ReplicationFactor = v
									}
									{
										v := s.Configs
										a := v
										var l int32
										if isFlexible {
											l = b.CompactArrayLen()
										} else {
											l = b.ArrayLen()
										}
										if !b.Ok() {
											return b.Complete()
										}
										a = a[:0]
										if l > 0 {
											a = append(a, make([]TopicInfoConfig, l)...)
										}
										for i := int32(0); i < l; i++ {
											v := &a[i]
											v.Default()
											s := v
											{
												var v string
												if unsafe {
													if isFlexible {
														v = b.UnsafeCompactString()
													} else {
														v = b.UnsafeString()
													}
												} else {
													if isFlexible {
														v = b.CompactString()
													} else {
														v = b.String()
													}
												}
												s.Key = v
											}
											{
												var v string
												if unsafe {
													if isFlexible {
														v = b.UnsafeCompactString()
													} else {
														v = b.UnsafeString()
													}
												} else {
													if isFlexible {
														v = b.CompactString()
													} else {
														v = b.String()
													}
												}
												s.Value = v
											}
											if isFlexible {
												s.UnknownTags = internalReadTags(&b)
											}
										}
										v = a
										s.Configs = v
									}
									if isFlexible {
										s.UnknownTags = internalReadTags(&b)
									}
								}
								v = a
								s.StateChangelogTopics = v
							}
							{
								v := s.RepartitionSourceTopics
								a := v
								var l int32
								if isFlexible {
									l = b.CompactArrayLen()
								} else {
									l = b.ArrayLen()
								}
								if !b.Ok() {
									return b.Complete()
								}
								a = a[:0]
								if l > 0 {
									a = append(a, make([]TopicInfo, l)...)
								}
								for i := int32(0); i < l; i++ {
									v := &a[i]
									v.Default()
									s := v
									{
										var v string
										if unsafe {
											if isFlexible {
												v = b.UnsafeCompactString()
											} else {
												v = b.UnsafeString()
											}
										} else {
											if isFlexible {
												v = b.CompactString()
											} else {
												v = b.String()
											}
										}
										s.Topic = v
									}
									{
										v := b.Int32()
										s.NumPartitions = v
									}
									{
										v := b.Int16()
										s.ReplicationFactor = v
									}
									{
										v := s.Configs
										a := v
										var l int32
										if isFlexible {
											l = b.CompactArrayLen()
										} else {
											l = b.ArrayLen()
										}
										if !b.Ok() {
											return b.Complete()
										}
										a = a[:0]
										if l > 0 {
											a = append(a, make([]TopicInfoConfig, l)...)
										}
										for i := int32(0); i < l; i++ {
											v := &a[i]
											v.Default()
											s := v
											{
												var v string
												if unsafe {
													if isFlexible {
														v = b.UnsafeCompactString()
													} else {
														v = b.UnsafeString()
													}
												} else {
													if isFlexible {
														v = b.CompactString()
													} else {
														v = b.String()
													}
												}
												s.Key = v
											}
											{
												var v string
												if unsafe {
													if isFlexible {
														v = b.UnsafeCompactString()
													} else {
														v = b.UnsafeString()
													}
												} else {
													if isFlexible {
														v = b.CompactString()
													} else {
														v = b.String()
													}
												}
												s.Value = v
											}
											if isFlexible {
												s.UnknownTags = internalReadTags(&b)
											}
										}
										v = a
										s.Configs = v
									}
									if isFlexible {
										s.UnknownTags = internalReadTags(&b)
									}
								}
								v = a
								s.RepartitionSourceTopics = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Subtopologies = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
			}
			{
				v := s.Members
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]StreamsGroupDescribeResponseGroupMember, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.MemberID = v
					}
					{
						v := b.Int32()
						s.MemberEpoch = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.InstanceID = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.RackID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientID = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ClientHost = v
					}
					{
						v := b.Int32()
						s.TopologyEpoch = v
					}
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.ProcessID = v
					}
					{
						if present := b.Int8(); present != -1 && b.Ok() {
							s.UserEndpoint = new(StreamsGroupDescribeResponseGroupMemberUserEndpoint)
							v := s.UserEndpoint
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Host = v
							}
							{
								v := b.Uint16()
								s.Port = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
					}
					{
						v := s.ClientTags
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]StreamsGroupDescribeResponseGroupMemberClientTag, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Key = v
							}
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.Value = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.ClientTags = v
					}
					{
						v := s.TaskOffsets
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]TaskOffset, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.SubtopologyID = v
							}
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int64()
								s.Offset = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.TaskOffsets = v
					}
					{
						v := s.TaskEndOffsets
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]TaskOffset, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								var v string
								if unsafe {
									if isFlexible {
										v = b.UnsafeCompactString()
									} else {
										v = b.UnsafeString()
									}
								} else {
									if isFlexible {
										v = b.CompactString()
									} else {
										v = b.String()
									}
								}
								s.SubtopologyID = v
							}
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int64()
								s.Offset = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.TaskEndOffsets = v
					}
					{
						v := &s.Assignment
						v.Default()
						s := v
						{
							v := s.ActiveTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.ActiveTasks = v
						}
						{
							v := s.StandbyTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.StandbyTasks = v
						}
						{
							v := s.WarmupTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.WarmupTasks = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						v := &s.TargetAssignment
						v.Default()
						s := v
						{
							v := s.ActiveTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.ActiveTasks = v
						}
						{
							v := s.StandbyTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.StandbyTasks = v
						}
						{
							v := s.WarmupTasks
							a := v
							var l int32
							if isFlexible {
								l = b.CompactArrayLen()
							} else {
								l = b.ArrayLen()
							}
							if !b.Ok() {
								return b.Complete()
							}
							a = a[:0]
							if l > 0 {
								a = append(a, make([]TaskIDs, l)...)
							}
							for i := int32(0); i < l; i++ {
								v := &a[i]
								v.Default()
								s := v
								{
									var v string
									if unsafe {
										if isFlexible {
											v = b.UnsafeCompactString()
										} else {
											v = b.UnsafeString()
										}
									} else {
										if isFlexible {
											v = b.CompactString()
										} else {
											v = b.String()
										}
									}
									s.SubtopologyID = v
								}
								{
									v := s.Partitions
									a := v
									var l int32
									if isFlexible {
										l = b.CompactArrayLen()
									} else {
										l = b.ArrayLen()
									}
									if !b.Ok() {
										return b.Complete()
									}
									a = a[:0]
									if l > 0 {
										a = append(a, make([]int32, l)...)
									}
									for i := int32(0); i < l; i++ {
										v := b.Int32()
										a[i] = v
									}
									v = a
									s.Partitions = v
								}
								if isFlexible {
									s.UnknownTags = internalReadTags(&b)
								}
							}
							v = a
							s.WarmupTasks = v
						}
						if isFlexible {
							s.UnknownTags = internalReadTags(&b)
						}
					}
					{
						v := b.Bool()
						s.IsClassic = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Members = v
			}
			{
				v := b.Int32()
				s.AuthorizedOperations = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrStreamsGroupDescribeResponse returns a pointer to a default StreamsGroupDescribeResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrStreamsGroupDescribeResponse() *StreamsGroupDescribeResponse {
	var v StreamsGroupDescribeResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to StreamsGroupDescribeResponse.
func (v *StreamsGroupDescribeResponse) Default() {
}

// NewStreamsGroupDescribeResponse returns a default StreamsGroupDescribeResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewStreamsGroupDescribeResponse() StreamsGroupDescribeResponse {
	var v StreamsGroupDescribeResponse
	v.Default()
	return v
}

type DescribeShareGroupOffsetsRequestGroupTopic struct {
	// Topic is the topic name.
	Topic string

	// Partitions are the partitions.
	Partitions []int32

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsRequestGroupTopic.
func (v *DescribeShareGroupOffsetsRequestGroupTopic) Default() {
}

// NewDescribeShareGroupOffsetsRequestGroupTopic returns a default DescribeShareGroupOffsetsRequestGroupTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsRequestGroupTopic() DescribeShareGroupOffsetsRequestGroupTopic {
	var v DescribeShareGroupOffsetsRequestGroupTopic
	v.Default()
	return v
}

type DescribeShareGroupOffsetsRequestGroup struct {
	// GroupID is the group identifier.
	GroupID string

	// Topics are the topics to describe offsets for, or null for all
	// topic-partitions.
	Topics []DescribeShareGroupOffsetsRequestGroupTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsRequestGroup.
func (v *DescribeShareGroupOffsetsRequestGroup) Default() {
}

// NewDescribeShareGroupOffsetsRequestGroup returns a default DescribeShareGroupOffsetsRequestGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsRequestGroup() DescribeShareGroupOffsetsRequestGroup {
	var v DescribeShareGroupOffsetsRequestGroup
	v.Default()
	return v
}

// DescribeShareGroupOffsetsRequest is a request to describe share group offsets.
// Version 1, introduced in Kafka 4.2, adds Lag to the response (KIP-1226).
type DescribeShareGroupOffsetsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// Groups are the groups to describe offsets for.
	Groups []DescribeShareGroupOffsetsRequestGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeShareGroupOffsetsRequest) Key() int16                   { return 90 }
func (*DescribeShareGroupOffsetsRequest) MaxVersion() int16            { return 1 }
func (v *DescribeShareGroupOffsetsRequest) SetVersion(version int16)   { v.Version = version }
func (v *DescribeShareGroupOffsetsRequest) GetVersion() int16          { return v.Version }
func (v *DescribeShareGroupOffsetsRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *DescribeShareGroupOffsetsRequest) IsGroupCoordinatorRequest() {}
func (v *DescribeShareGroupOffsetsRequest) ResponseKind() Response {
	r := &DescribeShareGroupOffsetsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DescribeShareGroupOffsetsRequest) RequestWith(ctx context.Context, r Requestor) (*DescribeShareGroupOffsetsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DescribeShareGroupOffsetsResponse)
	return resp, err
}

func (v *DescribeShareGroupOffsetsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.GroupID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactNullableArrayLen(dst, len(v), v == nil)
				} else {
					dst = kbin.AppendNullableArrayLen(dst, len(v), v == nil)
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := v[i]
							dst = kbin.AppendInt32(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeShareGroupOffsetsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeShareGroupOffsetsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeShareGroupOffsetsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeShareGroupOffsetsRequestGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if version < 0 || l == 0 {
					a = []DescribeShareGroupOffsetsRequestGroupTopic{}
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeShareGroupOffsetsRequestGroupTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]int32, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := b.Int32()
							a[i] = v
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeShareGroupOffsetsRequest returns a pointer to a default DescribeShareGroupOffsetsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeShareGroupOffsetsRequest() *DescribeShareGroupOffsetsRequest {
	var v DescribeShareGroupOffsetsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsRequest.
func (v *DescribeShareGroupOffsetsRequest) Default() {
}

// NewDescribeShareGroupOffsetsRequest returns a default DescribeShareGroupOffsetsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsRequest() DescribeShareGroupOffsetsRequest {
	var v DescribeShareGroupOffsetsRequest
	v.Default()
	return v
}

type DescribeShareGroupOffsetsResponseGroupTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// StartOffset is the share-partition start offset.
	StartOffset int64

	// LeaderEpoch is the leader epoch of the partition.
	LeaderEpoch int32

	// Lag is the share-partition lag. -1 if not available.
	//
	// This field has a default of -1.
	Lag int64 // v1+

	// ErrorCode is the partition-level error code, or 0 if there was no
	// error.
	ErrorCode int16

	// ErrorMessage is the partition-level error message, or null if there
	// was no error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsResponseGroupTopicPartition.
func (v *DescribeShareGroupOffsetsResponseGroupTopicPartition) Default() {
	v.Lag = -1
}

// NewDescribeShareGroupOffsetsResponseGroupTopicPartition returns a default DescribeShareGroupOffsetsResponseGroupTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsResponseGroupTopicPartition() DescribeShareGroupOffsetsResponseGroupTopicPartition {
	var v DescribeShareGroupOffsetsResponseGroupTopicPartition
	v.Default()
	return v
}

type DescribeShareGroupOffsetsResponseGroupTopic struct {
	// Topic is the topic name.
	Topic string

	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the partition results.
	Partitions []DescribeShareGroupOffsetsResponseGroupTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsResponseGroupTopic.
func (v *DescribeShareGroupOffsetsResponseGroupTopic) Default() {
}

// NewDescribeShareGroupOffsetsResponseGroupTopic returns a default DescribeShareGroupOffsetsResponseGroupTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsResponseGroupTopic() DescribeShareGroupOffsetsResponseGroupTopic {
	var v DescribeShareGroupOffsetsResponseGroupTopic
	v.Default()
	return v
}

type DescribeShareGroupOffsetsResponseGroup struct {
	// GroupID is the group identifier.
	GroupID string

	// Topics are the results for each topic.
	Topics []DescribeShareGroupOffsetsResponseGroupTopic

	// ErrorCode is the group-level error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the group-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsResponseGroup.
func (v *DescribeShareGroupOffsetsResponseGroup) Default() {
}

// NewDescribeShareGroupOffsetsResponseGroup returns a default DescribeShareGroupOffsetsResponseGroup
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsResponseGroup() DescribeShareGroupOffsetsResponseGroup {
	var v DescribeShareGroupOffsetsResponseGroup
	v.Default()
	return v
}

// DescribeShareGroupOffsetsResponse is a response for a DescribeShareGroupOffsetsRequest.
//
// Supported errors:
// - GROUP_AUTHORIZATION_FAILED (version 0+)
// - TOPIC_AUTHORIZATION_FAILED (version 0+)
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - INVALID_REQUEST (version 0+)
// - UNKNOWN_SERVER_ERROR (version 0+)
type DescribeShareGroupOffsetsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// Groups are the results for each group.
	Groups []DescribeShareGroupOffsetsResponseGroup

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DescribeShareGroupOffsetsResponse) Key() int16                 { return 90 }
func (*DescribeShareGroupOffsetsResponse) MaxVersion() int16          { return 1 }
func (v *DescribeShareGroupOffsetsResponse) SetVersion(version int16) { v.Version = version }
func (v *DescribeShareGroupOffsetsResponse) GetVersion() int16        { return v.Version }
func (v *DescribeShareGroupOffsetsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DescribeShareGroupOffsetsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DescribeShareGroupOffsetsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DescribeShareGroupOffsetsResponse) RequestKind() Request {
	return &DescribeShareGroupOffsetsRequest{Version: v.Version}
}

func (v *DescribeShareGroupOffsetsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.Groups
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.GroupID
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Topics
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Topic
						if isFlexible {
							dst = kbin.AppendCompactString(dst, v)
						} else {
							dst = kbin.AppendString(dst, v)
						}
					}
					{
						v := v.TopicID
						dst = kbin.AppendUuid(dst, v)
					}
					{
						v := v.Partitions
						if isFlexible {
							dst = kbin.AppendCompactArrayLen(dst, len(v))
						} else {
							dst = kbin.AppendArrayLen(dst, len(v))
						}
						for i := range v {
							v := &v[i]
							{
								v := v.Partition
								dst = kbin.AppendInt32(dst, v)
							}
							{
								v := v.StartOffset
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.LeaderEpoch
								dst = kbin.AppendInt32(dst, v)
							}
							if version >= 1 {
								v := v.Lag
								dst = kbin.AppendInt64(dst, v)
							}
							{
								v := v.ErrorCode
								dst = kbin.AppendInt16(dst, v)
							}
							{
								v := v.ErrorMessage
								if isFlexible {
									dst = kbin.AppendCompactNullableString(dst, v)
								} else {
									dst = kbin.AppendNullableString(dst, v)
								}
							}
							if isFlexible {
								dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
								dst = v.UnknownTags.AppendEach(dst)
							}
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DescribeShareGroupOffsetsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DescribeShareGroupOffsetsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DescribeShareGroupOffsetsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := s.Groups
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DescribeShareGroupOffsetsResponseGroup, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.GroupID = v
			}
			{
				v := s.Topics
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]DescribeShareGroupOffsetsResponseGroupTopic, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						var v string
						if unsafe {
							if isFlexible {
								v = b.UnsafeCompactString()
							} else {
								v = b.UnsafeString()
							}
						} else {
							if isFlexible {
								v = b.CompactString()
							} else {
								v = b.String()
							}
						}
						s.Topic = v
					}
					{
						v := b.Uuid()
						s.TopicID = v
					}
					{
						v := s.Partitions
						a := v
						var l int32
						if isFlexible {
							l = b.CompactArrayLen()
						} else {
							l = b.ArrayLen()
						}
						if !b.Ok() {
							return b.Complete()
						}
						a = a[:0]
						if l > 0 {
							a = append(a, make([]DescribeShareGroupOffsetsResponseGroupTopicPartition, l)...)
						}
						for i := int32(0); i < l; i++ {
							v := &a[i]
							v.Default()
							s := v
							{
								v := b.Int32()
								s.Partition = v
							}
							{
								v := b.Int64()
								s.StartOffset = v
							}
							{
								v := b.Int32()
								s.LeaderEpoch = v
							}
							if version >= 1 {
								v := b.Int64()
								s.Lag = v
							}
							{
								v := b.Int16()
								s.ErrorCode = v
							}
							{
								var v *string
								if isFlexible {
									if unsafe {
										v = b.UnsafeCompactNullableString()
									} else {
										v = b.CompactNullableString()
									}
								} else {
									if unsafe {
										v = b.UnsafeNullableString()
									} else {
										v = b.NullableString()
									}
								}
								s.ErrorMessage = v
							}
							if isFlexible {
								s.UnknownTags = internalReadTags(&b)
							}
						}
						v = a
						s.Partitions = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Topics = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Groups = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDescribeShareGroupOffsetsResponse returns a pointer to a default DescribeShareGroupOffsetsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDescribeShareGroupOffsetsResponse() *DescribeShareGroupOffsetsResponse {
	var v DescribeShareGroupOffsetsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DescribeShareGroupOffsetsResponse.
func (v *DescribeShareGroupOffsetsResponse) Default() {
}

// NewDescribeShareGroupOffsetsResponse returns a default DescribeShareGroupOffsetsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDescribeShareGroupOffsetsResponse() DescribeShareGroupOffsetsResponse {
	var v DescribeShareGroupOffsetsResponse
	v.Default()
	return v
}

type AlterShareGroupOffsetsRequestTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// StartOffset is the share-partition start offset.
	StartOffset int64

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsRequestTopicPartition.
func (v *AlterShareGroupOffsetsRequestTopicPartition) Default() {
}

// NewAlterShareGroupOffsetsRequestTopicPartition returns a default AlterShareGroupOffsetsRequestTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsRequestTopicPartition() AlterShareGroupOffsetsRequestTopicPartition {
	var v AlterShareGroupOffsetsRequestTopicPartition
	v.Default()
	return v
}

type AlterShareGroupOffsetsRequestTopic struct {
	// Topic is the topic name.
	Topic string

	// Partitions are each partition to alter offsets for.
	Partitions []AlterShareGroupOffsetsRequestTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsRequestTopic.
func (v *AlterShareGroupOffsetsRequestTopic) Default() {
}

// NewAlterShareGroupOffsetsRequestTopic returns a default AlterShareGroupOffsetsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsRequestTopic() AlterShareGroupOffsetsRequestTopic {
	var v AlterShareGroupOffsetsRequestTopic
	v.Default()
	return v
}

// AlterShareGroupOffsetsRequest is a request to alter share group offsets.
type AlterShareGroupOffsetsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the topics to alter offsets for.
	Topics []AlterShareGroupOffsetsRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterShareGroupOffsetsRequest) Key() int16                   { return 91 }
func (*AlterShareGroupOffsetsRequest) MaxVersion() int16            { return 0 }
func (v *AlterShareGroupOffsetsRequest) SetVersion(version int16)   { v.Version = version }
func (v *AlterShareGroupOffsetsRequest) GetVersion() int16          { return v.Version }
func (v *AlterShareGroupOffsetsRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *AlterShareGroupOffsetsRequest) IsGroupCoordinatorRequest() {}
func (v *AlterShareGroupOffsetsRequest) ResponseKind() Response {
	r := &AlterShareGroupOffsetsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *AlterShareGroupOffsetsRequest) RequestWith(ctx context.Context, r Requestor) (*AlterShareGroupOffsetsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*AlterShareGroupOffsetsResponse)
	return resp, err
}

func (v *AlterShareGroupOffsetsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.StartOffset
						dst = kbin.AppendInt64(dst, v)
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterShareGroupOffsetsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterShareGroupOffsetsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterShareGroupOffsetsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterShareGroupOffsetsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterShareGroupOffsetsRequestTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int64()
						s.StartOffset = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterShareGroupOffsetsRequest returns a pointer to a default AlterShareGroupOffsetsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterShareGroupOffsetsRequest() *AlterShareGroupOffsetsRequest {
	var v AlterShareGroupOffsetsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsRequest.
func (v *AlterShareGroupOffsetsRequest) Default() {
}

// NewAlterShareGroupOffsetsRequest returns a default AlterShareGroupOffsetsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsRequest() AlterShareGroupOffsetsRequest {
	var v AlterShareGroupOffsetsRequest
	v.Default()
	return v
}

type AlterShareGroupOffsetsResponseTopicPartition struct {
	// Partition is the partition index.
	Partition int32

	// ErrorCode is the error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the error message, or null if there was no error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsResponseTopicPartition.
func (v *AlterShareGroupOffsetsResponseTopicPartition) Default() {
}

// NewAlterShareGroupOffsetsResponseTopicPartition returns a default AlterShareGroupOffsetsResponseTopicPartition
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsResponseTopicPartition() AlterShareGroupOffsetsResponseTopicPartition {
	var v AlterShareGroupOffsetsResponseTopicPartition
	v.Default()
	return v
}

type AlterShareGroupOffsetsResponseTopic struct {
	// Topic is the topic name.
	Topic string

	// TopicID is the unique topic ID.
	TopicID [16]byte

	// Partitions are the partition results.
	Partitions []AlterShareGroupOffsetsResponseTopicPartition

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsResponseTopic.
func (v *AlterShareGroupOffsetsResponseTopic) Default() {
}

// NewAlterShareGroupOffsetsResponseTopic returns a default AlterShareGroupOffsetsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsResponseTopic() AlterShareGroupOffsetsResponseTopic {
	var v AlterShareGroupOffsetsResponseTopic
	v.Default()
	return v
}

// AlterShareGroupOffsetsResponse is a response for an AlterShareGroupOffsetsRequest.
//
// Supported errors:
// - GROUP_AUTHORIZATION_FAILED (version 0+)
// - TOPIC_AUTHORIZATION_FAILED (version 0+)
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - NON_EMPTY_GROUP (version 0+)
// - KAFKA_STORAGE_ERROR (version 0+)
// - INVALID_REQUEST (version 0+)
// - UNKNOWN_SERVER_ERROR (version 0+)
type AlterShareGroupOffsetsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the top-level error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// Topics are the results for each topic.
	Topics []AlterShareGroupOffsetsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*AlterShareGroupOffsetsResponse) Key() int16                 { return 91 }
func (*AlterShareGroupOffsetsResponse) MaxVersion() int16          { return 0 }
func (v *AlterShareGroupOffsetsResponse) SetVersion(version int16) { v.Version = version }
func (v *AlterShareGroupOffsetsResponse) GetVersion() int16        { return v.Version }
func (v *AlterShareGroupOffsetsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *AlterShareGroupOffsetsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *AlterShareGroupOffsetsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *AlterShareGroupOffsetsResponse) RequestKind() Request {
	return &AlterShareGroupOffsetsRequest{Version: v.Version}
}

func (v *AlterShareGroupOffsetsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.Partitions
				if isFlexible {
					dst = kbin.AppendCompactArrayLen(dst, len(v))
				} else {
					dst = kbin.AppendArrayLen(dst, len(v))
				}
				for i := range v {
					v := &v[i]
					{
						v := v.Partition
						dst = kbin.AppendInt32(dst, v)
					}
					{
						v := v.ErrorCode
						dst = kbin.AppendInt16(dst, v)
					}
					{
						v := v.ErrorMessage
						if isFlexible {
							dst = kbin.AppendCompactNullableString(dst, v)
						} else {
							dst = kbin.AppendNullableString(dst, v)
						}
					}
					if isFlexible {
						dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
						dst = v.UnknownTags.AppendEach(dst)
					}
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *AlterShareGroupOffsetsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *AlterShareGroupOffsetsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *AlterShareGroupOffsetsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]AlterShareGroupOffsetsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := s.Partitions
				a := v
				var l int32
				if isFlexible {
					l = b.CompactArrayLen()
				} else {
					l = b.ArrayLen()
				}
				if !b.Ok() {
					return b.Complete()
				}
				a = a[:0]
				if l > 0 {
					a = append(a, make([]AlterShareGroupOffsetsResponseTopicPartition, l)...)
				}
				for i := int32(0); i < l; i++ {
					v := &a[i]
					v.Default()
					s := v
					{
						v := b.Int32()
						s.Partition = v
					}
					{
						v := b.Int16()
						s.ErrorCode = v
					}
					{
						var v *string
						if isFlexible {
							if unsafe {
								v = b.UnsafeCompactNullableString()
							} else {
								v = b.CompactNullableString()
							}
						} else {
							if unsafe {
								v = b.UnsafeNullableString()
							} else {
								v = b.NullableString()
							}
						}
						s.ErrorMessage = v
					}
					if isFlexible {
						s.UnknownTags = internalReadTags(&b)
					}
				}
				v = a
				s.Partitions = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrAlterShareGroupOffsetsResponse returns a pointer to a default AlterShareGroupOffsetsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrAlterShareGroupOffsetsResponse() *AlterShareGroupOffsetsResponse {
	var v AlterShareGroupOffsetsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to AlterShareGroupOffsetsResponse.
func (v *AlterShareGroupOffsetsResponse) Default() {
}

// NewAlterShareGroupOffsetsResponse returns a default AlterShareGroupOffsetsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewAlterShareGroupOffsetsResponse() AlterShareGroupOffsetsResponse {
	var v AlterShareGroupOffsetsResponse
	v.Default()
	return v
}

type DeleteShareGroupOffsetsRequestTopic struct {
	// Topic is the topic name.
	Topic string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupOffsetsRequestTopic.
func (v *DeleteShareGroupOffsetsRequestTopic) Default() {
}

// NewDeleteShareGroupOffsetsRequestTopic returns a default DeleteShareGroupOffsetsRequestTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupOffsetsRequestTopic() DeleteShareGroupOffsetsRequestTopic {
	var v DeleteShareGroupOffsetsRequestTopic
	v.Default()
	return v
}

// DeleteShareGroupOffsetsRequest is a request to delete share group offsets.
type DeleteShareGroupOffsetsRequest struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// GroupID is the group identifier.
	GroupID string

	// Topics are the topics to delete offsets for.
	Topics []DeleteShareGroupOffsetsRequestTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DeleteShareGroupOffsetsRequest) Key() int16                   { return 92 }
func (*DeleteShareGroupOffsetsRequest) MaxVersion() int16            { return 0 }
func (v *DeleteShareGroupOffsetsRequest) SetVersion(version int16)   { v.Version = version }
func (v *DeleteShareGroupOffsetsRequest) GetVersion() int16          { return v.Version }
func (v *DeleteShareGroupOffsetsRequest) IsFlexible() bool           { return v.Version >= 0 }
func (v *DeleteShareGroupOffsetsRequest) IsGroupCoordinatorRequest() {}
func (v *DeleteShareGroupOffsetsRequest) ResponseKind() Response {
	r := &DeleteShareGroupOffsetsResponse{Version: v.Version}
	r.Default()
	return r
}

// RequestWith is requests v on r and returns the response or an error.
// For sharded requests, the response may be merged and still return an error.
// It is better to rely on client.RequestSharded than to rely on proper merging behavior.
func (v *DeleteShareGroupOffsetsRequest) RequestWith(ctx context.Context, r Requestor) (*DeleteShareGroupOffsetsResponse, error) {
	kresp, err := r.Request(ctx, v)
	resp, _ := kresp.(*DeleteShareGroupOffsetsResponse)
	return resp, err
}

func (v *DeleteShareGroupOffsetsRequest) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.GroupID
		if isFlexible {
			dst = kbin.AppendCompactString(dst, v)
		} else {
			dst = kbin.AppendString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteShareGroupOffsetsRequest) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteShareGroupOffsetsRequest) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteShareGroupOffsetsRequest) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		var v string
		if unsafe {
			if isFlexible {
				v = b.UnsafeCompactString()
			} else {
				v = b.UnsafeString()
			}
		} else {
			if isFlexible {
				v = b.CompactString()
			} else {
				v = b.String()
			}
		}
		s.GroupID = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteShareGroupOffsetsRequestTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteShareGroupOffsetsRequest returns a pointer to a default DeleteShareGroupOffsetsRequest
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteShareGroupOffsetsRequest() *DeleteShareGroupOffsetsRequest {
	var v DeleteShareGroupOffsetsRequest
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupOffsetsRequest.
func (v *DeleteShareGroupOffsetsRequest) Default() {
}

// NewDeleteShareGroupOffsetsRequest returns a default DeleteShareGroupOffsetsRequest
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupOffsetsRequest() DeleteShareGroupOffsetsRequest {
	var v DeleteShareGroupOffsetsRequest
	v.Default()
	return v
}

type DeleteShareGroupOffsetsResponseTopic struct {
	// Topic is the topic name.
	Topic string

	// TopicID is the unique topic ID.
	TopicID [16]byte

	// ErrorCode is the topic-level error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the topic-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupOffsetsResponseTopic.
func (v *DeleteShareGroupOffsetsResponseTopic) Default() {
}

// NewDeleteShareGroupOffsetsResponseTopic returns a default DeleteShareGroupOffsetsResponseTopic
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupOffsetsResponseTopic() DeleteShareGroupOffsetsResponseTopic {
	var v DeleteShareGroupOffsetsResponseTopic
	v.Default()
	return v
}

// DeleteShareGroupOffsetsResponse is a response for a DeleteShareGroupOffsetsRequest.
//
// Supported errors:
// - GROUP_AUTHORIZATION_FAILED (version 0+)
// - TOPIC_AUTHORIZATION_FAILED (version 0+)
// - NOT_COORDINATOR (version 0+)
// - COORDINATOR_NOT_AVAILABLE (version 0+)
// - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
// - GROUP_ID_NOT_FOUND (version 0+)
// - NON_EMPTY_GROUP (version 0+)
// - KAFKA_STORAGE_ERROR (version 0+)
// - INVALID_REQUEST (version 0+)
// - UNKNOWN_SERVER_ERROR (version 0+)
// - UNKNOWN_TOPIC_OR_PARTITION (version 0+)
type DeleteShareGroupOffsetsResponse struct {
	// Version is the version of this message used with a Kafka broker.
	Version int16

	// ThrottleMillis is how long of a throttle Kafka will apply to the client
	// after responding to this request.
	ThrottleMillis int32

	// ErrorCode is the top-level error code, or 0 if there was no error.
	ErrorCode int16

	// ErrorMessage is the top-level error message, or null if there was no
	// error.
	ErrorMessage *string

	// Topics are the results for each topic.
	Topics []DeleteShareGroupOffsetsResponseTopic

	// UnknownTags are tags Kafka sent that we do not know the purpose of.
	UnknownTags Tags
}

func (*DeleteShareGroupOffsetsResponse) Key() int16                 { return 92 }
func (*DeleteShareGroupOffsetsResponse) MaxVersion() int16          { return 0 }
func (v *DeleteShareGroupOffsetsResponse) SetVersion(version int16) { v.Version = version }
func (v *DeleteShareGroupOffsetsResponse) GetVersion() int16        { return v.Version }
func (v *DeleteShareGroupOffsetsResponse) IsFlexible() bool         { return v.Version >= 0 }
func (v *DeleteShareGroupOffsetsResponse) Throttle() (int32, bool) {
	return v.ThrottleMillis, v.Version >= 0
}

func (v *DeleteShareGroupOffsetsResponse) SetThrottle(throttleMillis int32) {
	v.ThrottleMillis = throttleMillis
}

func (v *DeleteShareGroupOffsetsResponse) RequestKind() Request {
	return &DeleteShareGroupOffsetsRequest{Version: v.Version}
}

func (v *DeleteShareGroupOffsetsResponse) AppendTo(dst []byte) []byte {
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	{
		v := v.ThrottleMillis
		dst = kbin.AppendInt32(dst, v)
	}
	{
		v := v.ErrorCode
		dst = kbin.AppendInt16(dst, v)
	}
	{
		v := v.ErrorMessage
		if isFlexible {
			dst = kbin.AppendCompactNullableString(dst, v)
		} else {
			dst = kbin.AppendNullableString(dst, v)
		}
	}
	{
		v := v.Topics
		if isFlexible {
			dst = kbin.AppendCompactArrayLen(dst, len(v))
		} else {
			dst = kbin.AppendArrayLen(dst, len(v))
		}
		for i := range v {
			v := &v[i]
			{
				v := v.Topic
				if isFlexible {
					dst = kbin.AppendCompactString(dst, v)
				} else {
					dst = kbin.AppendString(dst, v)
				}
			}
			{
				v := v.TopicID
				dst = kbin.AppendUuid(dst, v)
			}
			{
				v := v.ErrorCode
				dst = kbin.AppendInt16(dst, v)
			}
			{
				v := v.ErrorMessage
				if isFlexible {
					dst = kbin.AppendCompactNullableString(dst, v)
				} else {
					dst = kbin.AppendNullableString(dst, v)
				}
			}
			if isFlexible {
				dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
				dst = v.UnknownTags.AppendEach(dst)
			}
		}
	}
	if isFlexible {
		dst = kbin.AppendUvarint(dst, 0+uint32(v.UnknownTags.Len()))
		dst = v.UnknownTags.AppendEach(dst)
	}
	return dst
}

func (v *DeleteShareGroupOffsetsResponse) ReadFrom(src []byte) error {
	return v.readFrom(src, false)
}

func (v *DeleteShareGroupOffsetsResponse) UnsafeReadFrom(src []byte) error {
	return v.readFrom(src, true)
}

func (v *DeleteShareGroupOffsetsResponse) readFrom(src []byte, unsafe bool) error {
	v.Default()
	b := kbin.Reader{Src: src}
	version := v.Version
	_ = version
	isFlexible := version >= 0
	_ = isFlexible
	s := v
	{
		v := b.Int32()
		s.ThrottleMillis = v
	}
	{
		v := b.Int16()
		s.ErrorCode = v
	}
	{
		var v *string
		if isFlexible {
			if unsafe {
				v = b.UnsafeCompactNullableString()
			} else {
				v = b.CompactNullableString()
			}
		} else {
			if unsafe {
				v = b.UnsafeNullableString()
			} else {
				v = b.NullableString()
			}
		}
		s.ErrorMessage = v
	}
	{
		v := s.Topics
		a := v
		var l int32
		if isFlexible {
			l = b.CompactArrayLen()
		} else {
			l = b.ArrayLen()
		}
		if !b.Ok() {
			return b.Complete()
		}
		a = a[:0]
		if l > 0 {
			a = append(a, make([]DeleteShareGroupOffsetsResponseTopic, l)...)
		}
		for i := int32(0); i < l; i++ {
			v := &a[i]
			v.Default()
			s := v
			{
				var v string
				if unsafe {
					if isFlexible {
						v = b.UnsafeCompactString()
					} else {
						v = b.UnsafeString()
					}
				} else {
					if isFlexible {
						v = b.CompactString()
					} else {
						v = b.String()
					}
				}
				s.Topic = v
			}
			{
				v := b.Uuid()
				s.TopicID = v
			}
			{
				v := b.Int16()
				s.ErrorCode = v
			}
			{
				var v *string
				if isFlexible {
					if unsafe {
						v = b.UnsafeCompactNullableString()
					} else {
						v = b.CompactNullableString()
					}
				} else {
					if unsafe {
						v = b.UnsafeNullableString()
					} else {
						v = b.NullableString()
					}
				}
				s.ErrorMessage = v
			}
			if isFlexible {
				s.UnknownTags = internalReadTags(&b)
			}
		}
		v = a
		s.Topics = v
	}
	if isFlexible {
		s.UnknownTags = internalReadTags(&b)
	}
	return b.Complete()
}

// NewPtrDeleteShareGroupOffsetsResponse returns a pointer to a default DeleteShareGroupOffsetsResponse
// This is a shortcut for creating a new(struct) and calling Default yourself.
func NewPtrDeleteShareGroupOffsetsResponse() *DeleteShareGroupOffsetsResponse {
	var v DeleteShareGroupOffsetsResponse
	v.Default()
	return &v
}

// Default sets any default fields. Calling this allows for future compatibility
// if new fields are added to DeleteShareGroupOffsetsResponse.
func (v *DeleteShareGroupOffsetsResponse) Default() {
}

// NewDeleteShareGroupOffsetsResponse returns a default DeleteShareGroupOffsetsResponse
// This is a shortcut for creating a struct and calling Default yourself.
func NewDeleteShareGroupOffsetsResponse() DeleteShareGroupOffsetsResponse {
	var v DeleteShareGroupOffsetsResponse
	v.Default()
	return v
}

// RequestForKey returns the request corresponding to the given request key
// or nil if the key is unknown.
func RequestForKey(key int16) Request {
	switch key {
	default:
		return nil
	case 0:
		return NewPtrProduceRequest()
	case 1:
		return NewPtrFetchRequest()
	case 2:
		return NewPtrListOffsetsRequest()
	case 3:
		return NewPtrMetadataRequest()
	case 4:
		return NewPtrLeaderAndISRRequest()
	case 5:
		return NewPtrStopReplicaRequest()
	case 6:
		return NewPtrUpdateMetadataRequest()
	case 7:
		return NewPtrControlledShutdownRequest()
	case 8:
		return NewPtrOffsetCommitRequest()
	case 9:
		return NewPtrOffsetFetchRequest()
	case 10:
		return NewPtrFindCoordinatorRequest()
	case 11:
		return NewPtrJoinGroupRequest()
	case 12:
		return NewPtrHeartbeatRequest()
	case 13:
		return NewPtrLeaveGroupRequest()
	case 14:
		return NewPtrSyncGroupRequest()
	case 15:
		return NewPtrDescribeGroupsRequest()
	case 16:
		return NewPtrListGroupsRequest()
	case 17:
		return NewPtrSASLHandshakeRequest()
	case 18:
		return NewPtrApiVersionsRequest()
	case 19:
		return NewPtrCreateTopicsRequest()
	case 20:
		return NewPtrDeleteTopicsRequest()
	case 21:
		return NewPtrDeleteRecordsRequest()
	case 22:
		return NewPtrInitProducerIDRequest()
	case 23:
		return NewPtrOffsetForLeaderEpochRequest()
	case 24:
		return NewPtrAddPartitionsToTxnRequest()
	case 25:
		return NewPtrAddOffsetsToTxnRequest()
	case 26:
		return NewPtrEndTxnRequest()
	case 27:
		return NewPtrWriteTxnMarkersRequest()
	case 28:
		return NewPtrTxnOffsetCommitRequest()
	case 29:
		return NewPtrDescribeACLsRequest()
	case 30:
		return NewPtrCreateACLsRequest()
	case 31:
		return NewPtrDeleteACLsRequest()
	case 32:
		return NewPtrDescribeConfigsRequest()
	case 33:
		return NewPtrAlterConfigsRequest()
	case 34:
		return NewPtrAlterReplicaLogDirsRequest()
	case 35:
		return NewPtrDescribeLogDirsRequest()
	case 36:
		return NewPtrSASLAuthenticateRequest()
	case 37:
		return NewPtrCreatePartitionsRequest()
	case 38:
		return NewPtrCreateDelegationTokenRequest()
	case 39:
		return NewPtrRenewDelegationTokenRequest()
	case 40:
		return NewPtrExpireDelegationTokenRequest()
	case 41:
		return NewPtrDescribeDelegationTokenRequest()
	case 42:
		return NewPtrDeleteGroupsRequest()
	case 43:
		return NewPtrElectLeadersRequest()
	case 44:
		return NewPtrIncrementalAlterConfigsRequest()
	case 45:
		return NewPtrAlterPartitionAssignmentsRequest()
	case 46:
		return NewPtrListPartitionReassignmentsRequest()
	case 47:
		return NewPtrOffsetDeleteRequest()
	case 48:
		return NewPtrDescribeClientQuotasRequest()
	case 49:
		return NewPtrAlterClientQuotasRequest()
	case 50:
		return NewPtrDescribeUserSCRAMCredentialsRequest()
	case 51:
		return NewPtrAlterUserSCRAMCredentialsRequest()
	case 52:
		return NewPtrVoteRequest()
	case 53:
		return NewPtrBeginQuorumEpochRequest()
	case 54:
		return NewPtrEndQuorumEpochRequest()
	case 55:
		return NewPtrDescribeQuorumRequest()
	case 56:
		return NewPtrAlterPartitionRequest()
	case 57:
		return NewPtrUpdateFeaturesRequest()
	case 58:
		return NewPtrEnvelopeRequest()
	case 59:
		return NewPtrFetchSnapshotRequest()
	case 60:
		return NewPtrDescribeClusterRequest()
	case 61:
		return NewPtrDescribeProducersRequest()
	case 62:
		return NewPtrBrokerRegistrationRequest()
	case 63:
		return NewPtrBrokerHeartbeatRequest()
	case 64:
		return NewPtrUnregisterBrokerRequest()
	case 65:
		return NewPtrDescribeTransactionsRequest()
	case 66:
		return NewPtrListTransactionsRequest()
	case 67:
		return NewPtrAllocateProducerIDsRequest()
	case 68:
		return NewPtrConsumerGroupHeartbeatRequest()
	case 69:
		return NewPtrConsumerGroupDescribeRequest()
	case 70:
		return NewPtrControllerRegistrationRequest()
	case 71:
		return NewPtrGetTelemetrySubscriptionsRequest()
	case 72:
		return NewPtrPushTelemetryRequest()
	case 73:
		return NewPtrAssignReplicasToDirsRequest()
	case 74:
		return NewPtrListConfigResourcesRequest()
	case 75:
		return NewPtrDescribeTopicPartitionsRequest()
	case 76:
		return NewPtrShareGroupHeartbeatRequest()
	case 77:
		return NewPtrShareGroupDescribeRequest()
	case 78:
		return NewPtrShareFetchRequest()
	case 79:
		return NewPtrShareAcknowledgeRequest()
	case 80:
		return NewPtrAddRaftVoterRequest()
	case 81:
		return NewPtrRemoveRaftVoterRequest()
	case 82:
		return NewPtrUpdateRaftVoterRequest()
	case 83:
		return NewPtrInitializeShareGroupStateRequest()
	case 84:
		return NewPtrReadShareGroupStateRequest()
	case 85:
		return NewPtrWriteShareGroupStateRequest()
	case 86:
		return NewPtrDeleteShareGroupStateRequest()
	case 87:
		return NewPtrReadShareGroupStateSummaryRequest()
	case 88:
		return NewPtrStreamsGroupHeartbeatRequest()
	case 89:
		return NewPtrStreamsGroupDescribeRequest()
	case 90:
		return NewPtrDescribeShareGroupOffsetsRequest()
	case 91:
		return NewPtrAlterShareGroupOffsetsRequest()
	case 92:
		return NewPtrDeleteShareGroupOffsetsRequest()
	}
}

// ResponseForKey returns the response corresponding to the given request key
// or nil if the key is unknown.
func ResponseForKey(key int16) Response {
	switch key {
	default:
		return nil
	case 0:
		return NewPtrProduceResponse()
	case 1:
		return NewPtrFetchResponse()
	case 2:
		return NewPtrListOffsetsResponse()
	case 3:
		return NewPtrMetadataResponse()
	case 4:
		return NewPtrLeaderAndISRResponse()
	case 5:
		return NewPtrStopReplicaResponse()
	case 6:
		return NewPtrUpdateMetadataResponse()
	case 7:
		return NewPtrControlledShutdownResponse()
	case 8:
		return NewPtrOffsetCommitResponse()
	case 9:
		return NewPtrOffsetFetchResponse()
	case 10:
		return NewPtrFindCoordinatorResponse()
	case 11:
		return NewPtrJoinGroupResponse()
	case 12:
		return NewPtrHeartbeatResponse()
	case 13:
		return NewPtrLeaveGroupResponse()
	case 14:
		return NewPtrSyncGroupResponse()
	case 15:
		return NewPtrDescribeGroupsResponse()
	case 16:
		return NewPtrListGroupsResponse()
	case 17:
		return NewPtrSASLHandshakeResponse()
	case 18:
		return NewPtrApiVersionsResponse()
	case 19:
		return NewPtrCreateTopicsResponse()
	case 20:
		return NewPtrDeleteTopicsResponse()
	case 21:
		return NewPtrDeleteRecordsResponse()
	case 22:
		return NewPtrInitProducerIDResponse()
	case 23:
		return NewPtrOffsetForLeaderEpochResponse()
	case 24:
		return NewPtrAddPartitionsToTxnResponse()
	case 25:
		return NewPtrAddOffsetsToTxnResponse()
	case 26:
		return NewPtrEndTxnResponse()
	case 27:
		return NewPtrWriteTxnMarkersResponse()
	case 28:
		return NewPtrTxnOffsetCommitResponse()
	case 29:
		return NewPtrDescribeACLsResponse()
	case 30:
		return NewPtrCreateACLsResponse()
	case 31:
		return NewPtrDeleteACLsResponse()
	case 32:
		return NewPtrDescribeConfigsResponse()
	case 33:
		return NewPtrAlterConfigsResponse()
	case 34:
		return NewPtrAlterReplicaLogDirsResponse()
	case 35:
		return NewPtrDescribeLogDirsResponse()
	case 36:
		return NewPtrSASLAuthenticateResponse()
	case 37:
		return NewPtrCreatePartitionsResponse()
	case 38:
		return NewPtrCreateDelegationTokenResponse()
	case 39:
		return NewPtrRenewDelegationTokenResponse()
	case 40:
		return NewPtrExpireDelegationTokenResponse()
	case 41:
		return NewPtrDescribeDelegationTokenResponse()
	case 42:
		return NewPtrDeleteGroupsResponse()
	case 43:
		return NewPtrElectLeadersResponse()
	case 44:
		return NewPtrIncrementalAlterConfigsResponse()
	case 45:
		return NewPtrAlterPartitionAssignmentsResponse()
	case 46:
		return NewPtrListPartitionReassignmentsResponse()
	case 47:
		return NewPtrOffsetDeleteResponse()
	case 48:
		return NewPtrDescribeClientQuotasResponse()
	case 49:
		return NewPtrAlterClientQuotasResponse()
	case 50:
		return NewPtrDescribeUserSCRAMCredentialsResponse()
	case 51:
		return NewPtrAlterUserSCRAMCredentialsResponse()
	case 52:
		return NewPtrVoteResponse()
	case 53:
		return NewPtrBeginQuorumEpochResponse()
	case 54:
		return NewPtrEndQuorumEpochResponse()
	case 55:
		return NewPtrDescribeQuorumResponse()
	case 56:
		return NewPtrAlterPartitionResponse()
	case 57:
		return NewPtrUpdateFeaturesResponse()
	case 58:
		return NewPtrEnvelopeResponse()
	case 59:
		return NewPtrFetchSnapshotResponse()
	case 60:
		return NewPtrDescribeClusterResponse()
	case 61:
		return NewPtrDescribeProducersResponse()
	case 62:
		return NewPtrBrokerRegistrationResponse()
	case 63:
		return NewPtrBrokerHeartbeatResponse()
	case 64:
		return NewPtrUnregisterBrokerResponse()
	case 65:
		return NewPtrDescribeTransactionsResponse()
	case 66:
		return NewPtrListTransactionsResponse()
	case 67:
		return NewPtrAllocateProducerIDsResponse()
	case 68:
		return NewPtrConsumerGroupHeartbeatResponse()
	case 69:
		return NewPtrConsumerGroupDescribeResponse()
	case 70:
		return NewPtrControllerRegistrationResponse()
	case 71:
		return NewPtrGetTelemetrySubscriptionsResponse()
	case 72:
		return NewPtrPushTelemetryResponse()
	case 73:
		return NewPtrAssignReplicasToDirsResponse()
	case 74:
		return NewPtrListConfigResourcesResponse()
	case 75:
		return NewPtrDescribeTopicPartitionsResponse()
	case 76:
		return NewPtrShareGroupHeartbeatResponse()
	case 77:
		return NewPtrShareGroupDescribeResponse()
	case 78:
		return NewPtrShareFetchResponse()
	case 79:
		return NewPtrShareAcknowledgeResponse()
	case 80:
		return NewPtrAddRaftVoterResponse()
	case 81:
		return NewPtrRemoveRaftVoterResponse()
	case 82:
		return NewPtrUpdateRaftVoterResponse()
	case 83:
		return NewPtrInitializeShareGroupStateResponse()
	case 84:
		return NewPtrReadShareGroupStateResponse()
	case 85:
		return NewPtrWriteShareGroupStateResponse()
	case 86:
		return NewPtrDeleteShareGroupStateResponse()
	case 87:
		return NewPtrReadShareGroupStateSummaryResponse()
	case 88:
		return NewPtrStreamsGroupHeartbeatResponse()
	case 89:
		return NewPtrStreamsGroupDescribeResponse()
	case 90:
		return NewPtrDescribeShareGroupOffsetsResponse()
	case 91:
		return NewPtrAlterShareGroupOffsetsResponse()
	case 92:
		return NewPtrDeleteShareGroupOffsetsResponse()
	}
}

// NameForKey returns the name (e.g., "Fetch") corresponding to a given request key
// or "" if the key is unknown.
func NameForKey(key int16) string {
	switch key {
	default:
		return "Unknown"
	case 0:
		return "Produce"
	case 1:
		return "Fetch"
	case 2:
		return "ListOffsets"
	case 3:
		return "Metadata"
	case 4:
		return "LeaderAndISR"
	case 5:
		return "StopReplica"
	case 6:
		return "UpdateMetadata"
	case 7:
		return "ControlledShutdown"
	case 8:
		return "OffsetCommit"
	case 9:
		return "OffsetFetch"
	case 10:
		return "FindCoordinator"
	case 11:
		return "JoinGroup"
	case 12:
		return "Heartbeat"
	case 13:
		return "LeaveGroup"
	case 14:
		return "SyncGroup"
	case 15:
		return "DescribeGroups"
	case 16:
		return "ListGroups"
	case 17:
		return "SASLHandshake"
	case 18:
		return "ApiVersions"
	case 19:
		return "CreateTopics"
	case 20:
		return "DeleteTopics"
	case 21:
		return "DeleteRecords"
	case 22:
		return "InitProducerID"
	case 23:
		return "OffsetForLeaderEpoch"
	case 24:
		return "AddPartitionsToTxn"
	case 25:
		return "AddOffsetsToTxn"
	case 26:
		return "EndTxn"
	case 27:
		return "WriteTxnMarkers"
	case 28:
		return "TxnOffsetCommit"
	case 29:
		return "DescribeACLs"
	case 30:
		return "CreateACLs"
	case 31:
		return "DeleteACLs"
	case 32:
		return "DescribeConfigs"
	case 33:
		return "AlterConfigs"
	case 34:
		return "AlterReplicaLogDirs"
	case 35:
		return "DescribeLogDirs"
	case 36:
		return "SASLAuthenticate"
	case 37:
		return "CreatePartitions"
	case 38:
		return "CreateDelegationToken"
	case 39:
		return "RenewDelegationToken"
	case 40:
		return "ExpireDelegationToken"
	case 41:
		return "DescribeDelegationToken"
	case 42:
		return "DeleteGroups"
	case 43:
		return "ElectLeaders"
	case 44:
		return "IncrementalAlterConfigs"
	case 45:
		return "AlterPartitionAssignments"
	case 46:
		return "ListPartitionReassignments"
	case 47:
		return "OffsetDelete"
	case 48:
		return "DescribeClientQuotas"
	case 49:
		return "AlterClientQuotas"
	case 50:
		return "DescribeUserSCRAMCredentials"
	case 51:
		return "AlterUserSCRAMCredentials"
	case 52:
		return "Vote"
	case 53:
		return "BeginQuorumEpoch"
	case 54:
		return "EndQuorumEpoch"
	case 55:
		return "DescribeQuorum"
	case 56:
		return "AlterPartition"
	case 57:
		return "UpdateFeatures"
	case 58:
		return "Envelope"
	case 59:
		return "FetchSnapshot"
	case 60:
		return "DescribeCluster"
	case 61:
		return "DescribeProducers"
	case 62:
		return "BrokerRegistration"
	case 63:
		return "BrokerHeartbeat"
	case 64:
		return "UnregisterBroker"
	case 65:
		return "DescribeTransactions"
	case 66:
		return "ListTransactions"
	case 67:
		return "AllocateProducerIDs"
	case 68:
		return "ConsumerGroupHeartbeat"
	case 69:
		return "ConsumerGroupDescribe"
	case 70:
		return "ControllerRegistration"
	case 71:
		return "GetTelemetrySubscriptions"
	case 72:
		return "PushTelemetry"
	case 73:
		return "AssignReplicasToDirs"
	case 74:
		return "ListConfigResources"
	case 75:
		return "DescribeTopicPartitions"
	case 76:
		return "ShareGroupHeartbeat"
	case 77:
		return "ShareGroupDescribe"
	case 78:
		return "ShareFetch"
	case 79:
		return "ShareAcknowledge"
	case 80:
		return "AddRaftVoter"
	case 81:
		return "RemoveRaftVoter"
	case 82:
		return "UpdateRaftVoter"
	case 83:
		return "InitializeShareGroupState"
	case 84:
		return "ReadShareGroupState"
	case 85:
		return "WriteShareGroupState"
	case 86:
		return "DeleteShareGroupState"
	case 87:
		return "ReadShareGroupStateSummary"
	case 88:
		return "StreamsGroupHeartbeat"
	case 89:
		return "StreamsGroupDescribe"
	case 90:
		return "DescribeShareGroupOffsets"
	case 91:
		return "AlterShareGroupOffsets"
	case 92:
		return "DeleteShareGroupOffsets"
	}
}

// Key is a typed representation of a request key, with helper functions.
type Key int16

const (
	Produce                      Key = 0
	Fetch                        Key = 1
	ListOffsets                  Key = 2
	Metadata                     Key = 3
	LeaderAndISR                 Key = 4
	StopReplica                  Key = 5
	UpdateMetadata               Key = 6
	ControlledShutdown           Key = 7
	OffsetCommit                 Key = 8
	OffsetFetch                  Key = 9
	FindCoordinator              Key = 10
	JoinGroup                    Key = 11
	Heartbeat                    Key = 12
	LeaveGroup                   Key = 13
	SyncGroup                    Key = 14
	DescribeGroups               Key = 15
	ListGroups                   Key = 16
	SASLHandshake                Key = 17
	ApiVersions                  Key = 18
	CreateTopics                 Key = 19
	DeleteTopics                 Key = 20
	DeleteRecords                Key = 21
	InitProducerID               Key = 22
	OffsetForLeaderEpoch         Key = 23
	AddPartitionsToTxn           Key = 24
	AddOffsetsToTxn              Key = 25
	EndTxn                       Key = 26
	WriteTxnMarkers              Key = 27
	TxnOffsetCommit              Key = 28
	DescribeACLs                 Key = 29
	CreateACLs                   Key = 30
	DeleteACLs                   Key = 31
	DescribeConfigs              Key = 32
	AlterConfigs                 Key = 33
	AlterReplicaLogDirs          Key = 34
	DescribeLogDirs              Key = 35
	SASLAuthenticate             Key = 36
	CreatePartitions             Key = 37
	CreateDelegationToken        Key = 38
	RenewDelegationToken         Key = 39
	ExpireDelegationToken        Key = 40
	DescribeDelegationToken      Key = 41
	DeleteGroups                 Key = 42
	ElectLeaders                 Key = 43
	IncrementalAlterConfigs      Key = 44
	AlterPartitionAssignments    Key = 45
	ListPartitionReassignments   Key = 46
	OffsetDelete                 Key = 47
	DescribeClientQuotas         Key = 48
	AlterClientQuotas            Key = 49
	DescribeUserSCRAMCredentials Key = 50
	AlterUserSCRAMCredentials    Key = 51
	Vote                         Key = 52
	BeginQuorumEpoch             Key = 53
	EndQuorumEpoch               Key = 54
	DescribeQuorum               Key = 55
	AlterPartition               Key = 56
	UpdateFeatures               Key = 57
	Envelope                     Key = 58
	FetchSnapshot                Key = 59
	DescribeCluster              Key = 60
	DescribeProducers            Key = 61
	BrokerRegistration           Key = 62
	BrokerHeartbeat              Key = 63
	UnregisterBroker             Key = 64
	DescribeTransactions         Key = 65
	ListTransactions             Key = 66
	AllocateProducerIDs          Key = 67
	ConsumerGroupHeartbeat       Key = 68
	ConsumerGroupDescribe        Key = 69
	ControllerRegistration       Key = 70
	GetTelemetrySubscriptions    Key = 71
	PushTelemetry                Key = 72
	AssignReplicasToDirs         Key = 73
	ListConfigResources          Key = 74
	DescribeTopicPartitions      Key = 75
	ShareGroupHeartbeat          Key = 76
	ShareGroupDescribe           Key = 77
	ShareFetch                   Key = 78
	ShareAcknowledge             Key = 79
	AddRaftVoter                 Key = 80
	RemoveRaftVoter              Key = 81
	UpdateRaftVoter              Key = 82
	InitializeShareGroupState    Key = 83
	ReadShareGroupState          Key = 84
	WriteShareGroupState         Key = 85
	DeleteShareGroupState        Key = 86
	ReadShareGroupStateSummary   Key = 87
	StreamsGroupHeartbeat        Key = 88
	StreamsGroupDescribe         Key = 89
	DescribeShareGroupOffsets    Key = 90
	AlterShareGroupOffsets       Key = 91
	DeleteShareGroupOffsets      Key = 92
)

// Name returns the name for this key.
func (k Key) Name() string { return NameForKey(int16(k)) }

// Request returns a new request for this key if the key is known.
func (k Key) Request() Request { return RequestForKey(int16(k)) }

// Response returns a new response for this key if the key is known.
func (k Key) Response() Response { return ResponseForKey(int16(k)) }

// Int16 is an alias for int16(k).
func (k Key) Int16() int16 { return int16(k) }

// A type of config.
//
// Possible values and their meanings:
//
// * 2 (TOPIC)
//
// * 4 (BROKER)
//
// * 8 (BROKER_LOGGER)
//
// * 16 (CLIENT_METRICS)
//
// * 32 (GROUP_CONFIG)
type ConfigResourceType int8

func (v ConfigResourceType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 2:
		return "TOPIC"
	case 4:
		return "BROKER"
	case 8:
		return "BROKER_LOGGER"
	case 16:
		return "CLIENT_METRICS"
	case 32:
		return "GROUP_CONFIG"
	}
}

func ConfigResourceTypeStrings() []string {
	return []string{
		"TOPIC",
		"BROKER",
		"BROKER_LOGGER",
		"CLIENT_METRICS",
		"GROUP_CONFIG",
	}
}

// ParseConfigResourceType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseConfigResourceType(s string) (ConfigResourceType, error) {
	switch strnorm(s) {
	case "topic":
		return 2, nil
	case "broker":
		return 4, nil
	case "brokerlogger":
		return 8, nil
	case "clientmetrics":
		return 16, nil
	case "groupconfig":
		return 32, nil
	default:
		return 0, fmt.Errorf("ConfigResourceType: unable to parse %q", s)
	}
}

const (
	ConfigResourceTypeUnknown       ConfigResourceType = 0
	ConfigResourceTypeTopic         ConfigResourceType = 2
	ConfigResourceTypeBroker        ConfigResourceType = 4
	ConfigResourceTypeBrokerLogger  ConfigResourceType = 8
	ConfigResourceTypeClientMetrics ConfigResourceType = 16
	ConfigResourceTypeGroupConfig   ConfigResourceType = 32
)

// MarshalText implements encoding.TextMarshaler.
func (e ConfigResourceType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ConfigResourceType) UnmarshalText(text []byte) error {
	v, err := ParseConfigResourceType(string(text))
	*e = v
	return err
}

// Where a config entry is from. If there are no config synonyms,
// the source is DEFAULT_CONFIG.
//
// Possible values and their meanings:
//
// * 1 (DYNAMIC_TOPIC_CONFIG)
// Dynamic topic config for a specific topic.
//
// * 2 (DYNAMIC_BROKER_CONFIG)
// Dynamic broker config for a specific broker.
//
// * 3 (DYNAMIC_DEFAULT_BROKER_CONFIG)
// Dynamic broker config used as the default for all brokers in a cluster.
//
// * 4 (STATIC_BROKER_CONFIG)
// Static broker config provided at start up.
//
// * 5 (DEFAULT_CONFIG)
// Built-in default configuration for those that have defaults.
//
// * 6 (DYNAMIC_BROKER_LOGGER_CONFIG)
// Broker logger; see KIP-412.
//
// * 7 (CLIENT_METRICS_CONFIG)
// Client metrics; see KIP-714 / Kafka commit a53147e7d90.
//
// * 8 (GROUP_CONFIG)
// Group configs; see KAFKA-14511 / Kafka commit bbdf79e1b4f>
type ConfigSource int8

func (v ConfigSource) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "DYNAMIC_TOPIC_CONFIG"
	case 2:
		return "DYNAMIC_BROKER_CONFIG"
	case 3:
		return "DYNAMIC_DEFAULT_BROKER_CONFIG"
	case 4:
		return "STATIC_BROKER_CONFIG"
	case 5:
		return "DEFAULT_CONFIG"
	case 6:
		return "DYNAMIC_BROKER_LOGGER_CONFIG"
	case 7:
		return "CLIENT_METRICS_CONFIG"
	case 8:
		return "GROUP_CONFIG"
	}
}

func ConfigSourceStrings() []string {
	return []string{
		"DYNAMIC_TOPIC_CONFIG",
		"DYNAMIC_BROKER_CONFIG",
		"DYNAMIC_DEFAULT_BROKER_CONFIG",
		"STATIC_BROKER_CONFIG",
		"DEFAULT_CONFIG",
		"DYNAMIC_BROKER_LOGGER_CONFIG",
		"CLIENT_METRICS_CONFIG",
		"GROUP_CONFIG",
	}
}

// ParseConfigSource normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseConfigSource(s string) (ConfigSource, error) {
	switch strnorm(s) {
	case "dynamictopicconfig":
		return 1, nil
	case "dynamicbrokerconfig":
		return 2, nil
	case "dynamicdefaultbrokerconfig":
		return 3, nil
	case "staticbrokerconfig":
		return 4, nil
	case "defaultconfig":
		return 5, nil
	case "dynamicbrokerloggerconfig":
		return 6, nil
	case "clientmetricsconfig":
		return 7, nil
	case "groupconfig":
		return 8, nil
	default:
		return 0, fmt.Errorf("ConfigSource: unable to parse %q", s)
	}
}

const (
	ConfigSourceUnknown                    ConfigSource = 0
	ConfigSourceDynamicTopicConfig         ConfigSource = 1
	ConfigSourceDynamicBrokerConfig        ConfigSource = 2
	ConfigSourceDynamicDefaultBrokerConfig ConfigSource = 3
	ConfigSourceStaticBrokerConfig         ConfigSource = 4
	ConfigSourceDefaultConfig              ConfigSource = 5
	ConfigSourceDynamicBrokerLoggerConfig  ConfigSource = 6
	ConfigSourceClientMetricsConfig        ConfigSource = 7
	ConfigSourceGroupConfig                ConfigSource = 8
)

// MarshalText implements encoding.TextMarshaler.
func (e ConfigSource) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ConfigSource) UnmarshalText(text []byte) error {
	v, err := ParseConfigSource(string(text))
	*e = v
	return err
}

// A configuration data type.
//
// Possible values and their meanings:
//
// * 1 (BOOLEAN)
//
// * 2 (STRING)
//
// * 3 (INT)
//
// * 4 (SHORT)
//
// * 5 (LONG)
//
// * 6 (DOUBLE)
//
// * 7 (LIST)
//
// * 8 (CLASS)
//
// * 9 (PASSWORD)
type ConfigType int8

func (v ConfigType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "BOOLEAN"
	case 2:
		return "STRING"
	case 3:
		return "INT"
	case 4:
		return "SHORT"
	case 5:
		return "LONG"
	case 6:
		return "DOUBLE"
	case 7:
		return "LIST"
	case 8:
		return "CLASS"
	case 9:
		return "PASSWORD"
	}
}

func ConfigTypeStrings() []string {
	return []string{
		"BOOLEAN",
		"STRING",
		"INT",
		"SHORT",
		"LONG",
		"DOUBLE",
		"LIST",
		"CLASS",
		"PASSWORD",
	}
}

// ParseConfigType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseConfigType(s string) (ConfigType, error) {
	switch strnorm(s) {
	case "boolean":
		return 1, nil
	case "string":
		return 2, nil
	case "int":
		return 3, nil
	case "short":
		return 4, nil
	case "long":
		return 5, nil
	case "double":
		return 6, nil
	case "list":
		return 7, nil
	case "class":
		return 8, nil
	case "password":
		return 9, nil
	default:
		return 0, fmt.Errorf("ConfigType: unable to parse %q", s)
	}
}

const (
	ConfigTypeUnknown  ConfigType = 0
	ConfigTypeBoolean  ConfigType = 1
	ConfigTypeString   ConfigType = 2
	ConfigTypeInt      ConfigType = 3
	ConfigTypeShort    ConfigType = 4
	ConfigTypeLong     ConfigType = 5
	ConfigTypeDouble   ConfigType = 6
	ConfigTypeList     ConfigType = 7
	ConfigTypeClass    ConfigType = 8
	ConfigTypePassword ConfigType = 9
)

// MarshalText implements encoding.TextMarshaler.
func (e ConfigType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ConfigType) UnmarshalText(text []byte) error {
	v, err := ParseConfigType(string(text))
	*e = v
	return err
}

// An incremental configuration operation.
//
// Possible values and their meanings:
//
// * 0 (SET)
//
// * 1 (DELETE)
//
// * 2 (APPEND)
//
// * 3 (SUBTRACT)
type IncrementalAlterConfigOp int8

func (v IncrementalAlterConfigOp) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 0:
		return "SET"
	case 1:
		return "DELETE"
	case 2:
		return "APPEND"
	case 3:
		return "SUBTRACT"
	}
}

func IncrementalAlterConfigOpStrings() []string {
	return []string{
		"SET",
		"DELETE",
		"APPEND",
		"SUBTRACT",
	}
}

// ParseIncrementalAlterConfigOp normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseIncrementalAlterConfigOp(s string) (IncrementalAlterConfigOp, error) {
	switch strnorm(s) {
	case "set":
		return 0, nil
	case "delete":
		return 1, nil
	case "append":
		return 2, nil
	case "subtract":
		return 3, nil
	default:
		return 0, fmt.Errorf("IncrementalAlterConfigOp: unable to parse %q", s)
	}
}

const (
	IncrementalAlterConfigOpSet      IncrementalAlterConfigOp = 0
	IncrementalAlterConfigOpDelete   IncrementalAlterConfigOp = 1
	IncrementalAlterConfigOpAppend   IncrementalAlterConfigOp = 2
	IncrementalAlterConfigOpSubtract IncrementalAlterConfigOp = 3
)

// MarshalText implements encoding.TextMarshaler.
func (e IncrementalAlterConfigOp) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *IncrementalAlterConfigOp) UnmarshalText(text []byte) error {
	v, err := ParseIncrementalAlterConfigOp(string(text))
	*e = v
	return err
}

// ACLResourceType is a type of resource to use for ACLs.
//
// Possible values and their meanings:
//
// * 1 (ANY)
//
// * 2 (TOPIC)
//
// * 3 (GROUP)
//
// * 4 (CLUSTER)
//
// * 5 (TRANSACTIONAL_ID)
//
// * 6 (DELEGATION_TOKEN)
//
// * 7 (USER)
type ACLResourceType int8

func (v ACLResourceType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "ANY"
	case 2:
		return "TOPIC"
	case 3:
		return "GROUP"
	case 4:
		return "CLUSTER"
	case 5:
		return "TRANSACTIONAL_ID"
	case 6:
		return "DELEGATION_TOKEN"
	case 7:
		return "USER"
	}
}

func ACLResourceTypeStrings() []string {
	return []string{
		"ANY",
		"TOPIC",
		"GROUP",
		"CLUSTER",
		"TRANSACTIONAL_ID",
		"DELEGATION_TOKEN",
		"USER",
	}
}

// ParseACLResourceType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseACLResourceType(s string) (ACLResourceType, error) {
	switch strnorm(s) {
	case "any":
		return 1, nil
	case "topic":
		return 2, nil
	case "group":
		return 3, nil
	case "cluster":
		return 4, nil
	case "transactionalid":
		return 5, nil
	case "delegationtoken":
		return 6, nil
	case "user":
		return 7, nil
	default:
		return 0, fmt.Errorf("ACLResourceType: unable to parse %q", s)
	}
}

const (
	ACLResourceTypeUnknown         ACLResourceType = 0
	ACLResourceTypeAny             ACLResourceType = 1
	ACLResourceTypeTopic           ACLResourceType = 2
	ACLResourceTypeGroup           ACLResourceType = 3
	ACLResourceTypeCluster         ACLResourceType = 4
	ACLResourceTypeTransactionalId ACLResourceType = 5
	ACLResourceTypeDelegationToken ACLResourceType = 6
	ACLResourceTypeUser            ACLResourceType = 7
)

// MarshalText implements encoding.TextMarshaler.
func (e ACLResourceType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ACLResourceType) UnmarshalText(text []byte) error {
	v, err := ParseACLResourceType(string(text))
	*e = v
	return err
}

// ACLResourcePatternType is how an acl's ResourceName is understood.
//
// This field was added with Kafka 2.0.0 for KIP-290.
//
// Possible values and their meanings:
//
// * 1 (ANY)
// Matches anything.
//
// * 2 (MATCH)
// Performs pattern matching; i.e., a literal match, or a prefix match, or wildcard.
//
// * 3 (LITERAL)
// The name must be an exact match.
//
// * 4 (PREFIXED)
// The name must have our requested name as a prefix (that is, "foo" will match on "foobar").
type ACLResourcePatternType int8

func (v ACLResourcePatternType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "ANY"
	case 2:
		return "MATCH"
	case 3:
		return "LITERAL"
	case 4:
		return "PREFIXED"
	}
}

func ACLResourcePatternTypeStrings() []string {
	return []string{
		"ANY",
		"MATCH",
		"LITERAL",
		"PREFIXED",
	}
}

// ParseACLResourcePatternType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseACLResourcePatternType(s string) (ACLResourcePatternType, error) {
	switch strnorm(s) {
	case "any":
		return 1, nil
	case "match":
		return 2, nil
	case "literal":
		return 3, nil
	case "prefixed":
		return 4, nil
	default:
		return 0, fmt.Errorf("ACLResourcePatternType: unable to parse %q", s)
	}
}

const (
	ACLResourcePatternTypeUnknown  ACLResourcePatternType = 0
	ACLResourcePatternTypeAny      ACLResourcePatternType = 1
	ACLResourcePatternTypeMatch    ACLResourcePatternType = 2
	ACLResourcePatternTypeLiteral  ACLResourcePatternType = 3
	ACLResourcePatternTypePrefixed ACLResourcePatternType = 4
)

// MarshalText implements encoding.TextMarshaler.
func (e ACLResourcePatternType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ACLResourcePatternType) UnmarshalText(text []byte) error {
	v, err := ParseACLResourcePatternType(string(text))
	*e = v
	return err
}

// An ACL permission type.
//
// Possible values and their meanings:
//
// * 1 (ANY)
// Any permission.
//
// * 2 (DENY)
// Any deny permission.
//
// * 3 (ALLOW)
// Any allow permission.
type ACLPermissionType int8

func (v ACLPermissionType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "ANY"
	case 2:
		return "DENY"
	case 3:
		return "ALLOW"
	}
}

func ACLPermissionTypeStrings() []string {
	return []string{
		"ANY",
		"DENY",
		"ALLOW",
	}
}

// ParseACLPermissionType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseACLPermissionType(s string) (ACLPermissionType, error) {
	switch strnorm(s) {
	case "any":
		return 1, nil
	case "deny":
		return 2, nil
	case "allow":
		return 3, nil
	default:
		return 0, fmt.Errorf("ACLPermissionType: unable to parse %q", s)
	}
}

const (
	ACLPermissionTypeUnknown ACLPermissionType = 0
	ACLPermissionTypeAny     ACLPermissionType = 1
	ACLPermissionTypeDeny    ACLPermissionType = 2
	ACLPermissionTypeAllow   ACLPermissionType = 3
)

// MarshalText implements encoding.TextMarshaler.
func (e ACLPermissionType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ACLPermissionType) UnmarshalText(text []byte) error {
	v, err := ParseACLPermissionType(string(text))
	*e = v
	return err
}

// An ACL operation.
//
// Possible values and their meanings:
//
// * 1 (ANY)
// Matches anything.
//
// * 2 (ALL)
// Matches anything granted all permissions.
//
// * 3 (READ)
//
// * 4 (WRITE)
//
// * 5 (CREATE)
//
// * 6 (DELETE)
//
// * 7 (ALTER)
//
// * 8 (DESCRIBE)
//
// * 9 (CLUSTER_ACTION)
//
// * 10 (DESCRIBE_CONFIGS)
//
// * 11 (ALTER_CONFIGS)
//
// * 12 (IDEMPOTENT_WRITE)
//
// * 13 (CREATE_TOKENS)
//
// * 14 (DESCRIBE_TOKENS)
type ACLOperation int8

func (v ACLOperation) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 1:
		return "ANY"
	case 2:
		return "ALL"
	case 3:
		return "READ"
	case 4:
		return "WRITE"
	case 5:
		return "CREATE"
	case 6:
		return "DELETE"
	case 7:
		return "ALTER"
	case 8:
		return "DESCRIBE"
	case 9:
		return "CLUSTER_ACTION"
	case 10:
		return "DESCRIBE_CONFIGS"
	case 11:
		return "ALTER_CONFIGS"
	case 12:
		return "IDEMPOTENT_WRITE"
	case 13:
		return "CREATE_TOKENS"
	case 14:
		return "DESCRIBE_TOKENS"
	}
}

func ACLOperationStrings() []string {
	return []string{
		"ANY",
		"ALL",
		"READ",
		"WRITE",
		"CREATE",
		"DELETE",
		"ALTER",
		"DESCRIBE",
		"CLUSTER_ACTION",
		"DESCRIBE_CONFIGS",
		"ALTER_CONFIGS",
		"IDEMPOTENT_WRITE",
		"CREATE_TOKENS",
		"DESCRIBE_TOKENS",
	}
}

// ParseACLOperation normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseACLOperation(s string) (ACLOperation, error) {
	switch strnorm(s) {
	case "any":
		return 1, nil
	case "all":
		return 2, nil
	case "read":
		return 3, nil
	case "write":
		return 4, nil
	case "create":
		return 5, nil
	case "delete":
		return 6, nil
	case "alter":
		return 7, nil
	case "describe":
		return 8, nil
	case "clusteraction":
		return 9, nil
	case "describeconfigs":
		return 10, nil
	case "alterconfigs":
		return 11, nil
	case "idempotentwrite":
		return 12, nil
	case "createtokens":
		return 13, nil
	case "describetokens":
		return 14, nil
	default:
		return 0, fmt.Errorf("ACLOperation: unable to parse %q", s)
	}
}

const (
	ACLOperationUnknown         ACLOperation = 0
	ACLOperationAny             ACLOperation = 1
	ACLOperationAll             ACLOperation = 2
	ACLOperationRead            ACLOperation = 3
	ACLOperationWrite           ACLOperation = 4
	ACLOperationCreate          ACLOperation = 5
	ACLOperationDelete          ACLOperation = 6
	ACLOperationAlter           ACLOperation = 7
	ACLOperationDescribe        ACLOperation = 8
	ACLOperationClusterAction   ACLOperation = 9
	ACLOperationDescribeConfigs ACLOperation = 10
	ACLOperationAlterConfigs    ACLOperation = 11
	ACLOperationIdempotentWrite ACLOperation = 12
	ACLOperationCreateTokens    ACLOperation = 13
	ACLOperationDescribeTokens  ACLOperation = 14
)

// MarshalText implements encoding.TextMarshaler.
func (e ACLOperation) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ACLOperation) UnmarshalText(text []byte) error {
	v, err := ParseACLOperation(string(text))
	*e = v
	return err
}

// TransactionState is the state of a transaction.
//
// Possible values and their meanings:
//
// * 0 (Empty)
//
// * 1 (Ongoing)
//
// * 2 (PrepareCommit)
//
// * 3 (PrepareAbort)
//
// * 4 (CompleteCommit)
//
// * 5 (CompleteAbort)
//
// * 6 (Dead)
//
// * 7 (PrepareEpochFence)
type TransactionState int8

func (v TransactionState) String() string {
	switch v {
	default:
		return "Unknown"
	case 0:
		return "Empty"
	case 1:
		return "Ongoing"
	case 2:
		return "PrepareCommit"
	case 3:
		return "PrepareAbort"
	case 4:
		return "CompleteCommit"
	case 5:
		return "CompleteAbort"
	case 6:
		return "Dead"
	case 7:
		return "PrepareEpochFence"
	}
}

func TransactionStateStrings() []string {
	return []string{
		"Empty",
		"Ongoing",
		"PrepareCommit",
		"PrepareAbort",
		"CompleteCommit",
		"CompleteAbort",
		"Dead",
		"PrepareEpochFence",
	}
}

// ParseTransactionState normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseTransactionState(s string) (TransactionState, error) {
	switch strnorm(s) {
	case "empty":
		return 0, nil
	case "ongoing":
		return 1, nil
	case "preparecommit":
		return 2, nil
	case "prepareabort":
		return 3, nil
	case "completecommit":
		return 4, nil
	case "completeabort":
		return 5, nil
	case "dead":
		return 6, nil
	case "prepareepochfence":
		return 7, nil
	default:
		return 0, fmt.Errorf("TransactionState: unable to parse %q", s)
	}
}

const (
	TransactionStateEmpty             TransactionState = 0
	TransactionStateOngoing           TransactionState = 1
	TransactionStatePrepareCommit     TransactionState = 2
	TransactionStatePrepareAbort      TransactionState = 3
	TransactionStateCompleteCommit    TransactionState = 4
	TransactionStateCompleteAbort     TransactionState = 5
	TransactionStateDead              TransactionState = 6
	TransactionStatePrepareEpochFence TransactionState = 7
)

// MarshalText implements encoding.TextMarshaler.
func (e TransactionState) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *TransactionState) UnmarshalText(text []byte) error {
	v, err := ParseTransactionState(string(text))
	*e = v
	return err
}

// QuotasMatchType specifies how to match a Quota entity as part of the DescribeClientQuotasRequestComponent.
//
// Possible values and their meanings:
//
// * 0 (EXACT)
// Matches all quotas for the given EntityType with names equal to the Match field.
//
// * 1 (DEFAULT)
// Matches the default for the given EntityType.
//
// * 2 (ANY)
// Matches all named quotas and default quotas for the given EntityType.
type QuotasMatchType int8

func (v QuotasMatchType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 0:
		return "EXACT"
	case 1:
		return "DEFAULT"
	case 2:
		return "ANY"
	}
}

func QuotasMatchTypeStrings() []string {
	return []string{
		"EXACT",
		"DEFAULT",
		"ANY",
	}
}

// ParseQuotasMatchType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseQuotasMatchType(s string) (QuotasMatchType, error) {
	switch strnorm(s) {
	case "exact":
		return 0, nil
	case "default":
		return 1, nil
	case "any":
		return 2, nil
	default:
		return 0, fmt.Errorf("QuotasMatchType: unable to parse %q", s)
	}
}

const (
	QuotasMatchTypeExact   QuotasMatchType = 0
	QuotasMatchTypeDefault QuotasMatchType = 1
	QuotasMatchTypeAny     QuotasMatchType = 2
)

// MarshalText implements encoding.TextMarshaler.
func (e QuotasMatchType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *QuotasMatchType) UnmarshalText(text []byte) error {
	v, err := ParseQuotasMatchType(string(text))
	*e = v
	return err
}

// Possible values and their meanings:
//
// * 0 (ABORT)
//
// * 1 (COMMIT)
//
// * 2 (QUORUM_REASSIGNMENT)
// QUORUM_REASSIGNMENT was renamed to LEADER_CHANGE in Kafka 3.0
// (KAFKA-12952 commit d3ec9f940c), but the meaning is the same.
//
// * 3 (SNAPSHOT_HEADER)
//
// * 4 (SNAPSHOT_FOOTER)
//
// * 5 (KRAFT_VERSION)
//
// * 6 (KRAFT_VOTERS)
type ControlRecordKeyType int16

func (v ControlRecordKeyType) String() string {
	switch v {
	default:
		return "UNKNOWN"
	case 0:
		return "ABORT"
	case 1:
		return "COMMIT"
	case 2:
		return "QUORUM_REASSIGNMENT"
	case 3:
		return "SNAPSHOT_HEADER"
	case 4:
		return "SNAPSHOT_FOOTER"
	case 5:
		return "KRAFT_VERSION"
	case 6:
		return "KRAFT_VOTERS"
	}
}

func ControlRecordKeyTypeStrings() []string {
	return []string{
		"ABORT",
		"COMMIT",
		"QUORUM_REASSIGNMENT",
		"SNAPSHOT_HEADER",
		"SNAPSHOT_FOOTER",
		"KRAFT_VERSION",
		"KRAFT_VOTERS",
	}
}

// ParseControlRecordKeyType normalizes the input s and returns
// the value represented by the string.
//
// Normalizing works by stripping all dots, underscores, and dashes,
// trimming spaces, and lowercasing.
func ParseControlRecordKeyType(s string) (ControlRecordKeyType, error) {
	switch strnorm(s) {
	case "abort":
		return 0, nil
	case "commit":
		return 1, nil
	case "quorumreassignment":
		return 2, nil
	case "snapshotheader":
		return 3, nil
	case "snapshotfooter":
		return 4, nil
	case "kraftversion":
		return 5, nil
	case "kraftvoters":
		return 6, nil
	default:
		return 0, fmt.Errorf("ControlRecordKeyType: unable to parse %q", s)
	}
}

const (
	ControlRecordKeyTypeAbort              ControlRecordKeyType = 0
	ControlRecordKeyTypeCommit             ControlRecordKeyType = 1
	ControlRecordKeyTypeQuorumReassignment ControlRecordKeyType = 2
	ControlRecordKeyTypeSnapshotHeader     ControlRecordKeyType = 3
	ControlRecordKeyTypeSnapshotFooter     ControlRecordKeyType = 4
	ControlRecordKeyTypeKraftVersion       ControlRecordKeyType = 5
	ControlRecordKeyTypeKraftVoters        ControlRecordKeyType = 6
)

// MarshalText implements encoding.TextMarshaler.
func (e ControlRecordKeyType) MarshalText() (text []byte, err error) {
	return []byte(e.String()), nil
}

// UnmarshalText implements encoding.TextUnmarshaler.
func (e *ControlRecordKeyType) UnmarshalText(text []byte) error {
	v, err := ParseControlRecordKeyType(string(text))
	*e = v
	return err
}

func strnorm(s string) string {
	s = strings.ReplaceAll(s, ".", "")
	s = strings.ReplaceAll(s, "_", "")
	s = strings.ReplaceAll(s, "-", "")
	s = strings.TrimSpace(s)
	s = strings.ToLower(s)
	return s
}
