MCAP: GraphViz block diagram (.dot) source

MCAP is a modular container format and logging library for pub/sub messages with arbitrary message serialization. It is primarily intended for use in robotics applications, and works well under various workloads, resource constraints, and durability requirements.

Time values (log_time, publish_time, create_time) are represented in nanoseconds since a user-understood epoch (i.e. Unix epoch, robot boot time, etc.)

File extension

mcap

KS implementation details

License: Apache-2.0

This page hosts a formal specification of MCAP using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

GraphViz block diagram source

mcap.dot

digraph {
	rankdir=LR;
	node [shape=plaintext];
	subgraph cluster__mcap {
		label="Mcap";
		graph[style=dotted];

		mcap__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="header_magic_pos">0</TD><TD PORT="header_magic_size">8</TD><TD>Magic</TD><TD PORT="header_magic_type">header_magic</TD></TR>
			<TR><TD PORT="records_pos">8</TD><TD PORT="records_size">...</TD><TD>Record</TD><TD PORT="records_type">records</TD></TR>
			<TR><TD COLSPAN="4" PORT="records__repeat">repeat until _.op == :opcode_footer</TD></TR>
			<TR><TD PORT="footer_magic_pos">...</TD><TD PORT="footer_magic_size">8</TD><TD>Magic</TD><TD PORT="footer_magic_type">footer_magic</TD></TR>
		</TABLE>>];
		mcap__inst__footer [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="footer_pos">ofs_footer</TD><TD PORT="footer_size"></TD><TD>Record</TD><TD PORT="footer_type">footer</TD></TR>
		</TABLE>>];
		mcap__inst__ofs_footer [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
			<TR><TD>ofs_footer</TD><TD>(((_io.size - 1) - 8) - 20) - 8</TD></TR>
		</TABLE>>];
		subgraph cluster__attachment {
			label="Mcap::Attachment";
			graph[style=dotted];

			attachment__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="log_time_pos">0</TD><TD PORT="log_time_size">8</TD><TD>u8le</TD><TD PORT="log_time_type">log_time</TD></TR>
				<TR><TD PORT="create_time_pos">8</TD><TD PORT="create_time_size">8</TD><TD>u8le</TD><TD PORT="create_time_type">create_time</TD></TR>
				<TR><TD PORT="name_pos">16</TD><TD PORT="name_size">...</TD><TD>PrefixedStr</TD><TD PORT="name_type">name</TD></TR>
				<TR><TD PORT="content_type_pos">...</TD><TD PORT="content_type_size">...</TD><TD>PrefixedStr</TD><TD PORT="content_type_type">content_type</TD></TR>
				<TR><TD PORT="len_data_pos">...</TD><TD PORT="len_data_size">8</TD><TD>u8le</TD><TD PORT="len_data_type">len_data</TD></TR>
				<TR><TD PORT="data_pos">...</TD><TD PORT="data_size">len_data</TD><TD></TD><TD PORT="data_type">data</TD></TR>
				<TR><TD PORT="invoke_crc32_input_end_pos">...</TD><TD PORT="invoke_crc32_input_end_size">0</TD><TD></TD><TD PORT="invoke_crc32_input_end_type">invoke_crc32_input_end</TD></TR>
				<TR><TD COLSPAN="4" PORT="invoke_crc32_input_end__if">if crc32_input_end &gt;= 0</TD></TR>
				<TR><TD PORT="crc32_pos">...</TD><TD PORT="crc32_size">4</TD><TD>u4le</TD><TD PORT="crc32_type">crc32</TD></TR>
			</TABLE>>];
			attachment__inst__crc32_input [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="crc32_input_pos">0</TD><TD PORT="crc32_input_size">crc32_input_end</TD><TD></TD><TD PORT="crc32_input_type">crc32_input</TD></TR>
			</TABLE>>];
			attachment__inst__crc32_input_end [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>crc32_input_end</TD><TD>_io.pos</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__attachment_index {
			label="Mcap::AttachmentIndex";
			graph[style=dotted];

			attachment_index__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="ofs_attachment_pos">0</TD><TD PORT="ofs_attachment_size">8</TD><TD>u8le</TD><TD PORT="ofs_attachment_type">ofs_attachment</TD></TR>
				<TR><TD PORT="len_attachment_pos">8</TD><TD PORT="len_attachment_size">8</TD><TD>u8le</TD><TD PORT="len_attachment_type">len_attachment</TD></TR>
				<TR><TD PORT="log_time_pos">16</TD><TD PORT="log_time_size">8</TD><TD>u8le</TD><TD PORT="log_time_type">log_time</TD></TR>
				<TR><TD PORT="create_time_pos">24</TD><TD PORT="create_time_size">8</TD><TD>u8le</TD><TD PORT="create_time_type">create_time</TD></TR>
				<TR><TD PORT="data_size_pos">32</TD><TD PORT="data_size_size">8</TD><TD>u8le</TD><TD PORT="data_size_type">data_size</TD></TR>
				<TR><TD PORT="name_pos">40</TD><TD PORT="name_size">...</TD><TD>PrefixedStr</TD><TD PORT="name_type">name</TD></TR>
				<TR><TD PORT="content_type_pos">...</TD><TD PORT="content_type_size">...</TD><TD>PrefixedStr</TD><TD PORT="content_type_type">content_type</TD></TR>
			</TABLE>>];
			attachment_index__inst__attachment [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="attachment_pos">ofs_attachment</TD><TD PORT="attachment_size">len_attachment</TD><TD>Record</TD><TD PORT="attachment_type">attachment</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__channel {
			label="Mcap::Channel";
			graph[style=dotted];

			channel__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="id_pos">0</TD><TD PORT="id_size">2</TD><TD>u2le</TD><TD PORT="id_type">id</TD></TR>
				<TR><TD PORT="schema_id_pos">2</TD><TD PORT="schema_id_size">2</TD><TD>u2le</TD><TD PORT="schema_id_type">schema_id</TD></TR>
				<TR><TD PORT="topic_pos">4</TD><TD PORT="topic_size">...</TD><TD>PrefixedStr</TD><TD PORT="topic_type">topic</TD></TR>
				<TR><TD PORT="message_encoding_pos">...</TD><TD PORT="message_encoding_size">...</TD><TD>PrefixedStr</TD><TD PORT="message_encoding_type">message_encoding</TD></TR>
				<TR><TD PORT="metadata_pos">...</TD><TD PORT="metadata_size">...</TD><TD>MapStrStr</TD><TD PORT="metadata_type">metadata</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__chunk {
			label="Mcap::Chunk";
			graph[style=dotted];

			chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="message_start_time_pos">0</TD><TD PORT="message_start_time_size">8</TD><TD>u8le</TD><TD PORT="message_start_time_type">message_start_time</TD></TR>
				<TR><TD PORT="message_end_time_pos">8</TD><TD PORT="message_end_time_size">8</TD><TD>u8le</TD><TD PORT="message_end_time_type">message_end_time</TD></TR>
				<TR><TD PORT="uncompressed_size_pos">16</TD><TD PORT="uncompressed_size_size">8</TD><TD>u8le</TD><TD PORT="uncompressed_size_type">uncompressed_size</TD></TR>
				<TR><TD PORT="uncompressed_crc32_pos">24</TD><TD PORT="uncompressed_crc32_size">4</TD><TD>u4le</TD><TD PORT="uncompressed_crc32_type">uncompressed_crc32</TD></TR>
				<TR><TD PORT="compression_pos">28</TD><TD PORT="compression_size">...</TD><TD>PrefixedStr</TD><TD PORT="compression_type">compression</TD></TR>
				<TR><TD PORT="len_records_pos">...</TD><TD PORT="len_records_size">8</TD><TD>u8le</TD><TD PORT="len_records_type">len_records</TD></TR>
				<TR><TD PORT="records_pos">...</TD><TD PORT="records_size">...</TD><TD>switch (compression.str)</TD><TD PORT="records_type">records</TD></TR>
			</TABLE>>];
chunk__seq_records_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
	<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
	<TR><TD>&quot;&quot;</TD><TD PORT="case0">Records</TD></TR>
</TABLE>>];
		}
		subgraph cluster__chunk_index {
			label="Mcap::ChunkIndex";
			graph[style=dotted];

			chunk_index__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="message_start_time_pos">0</TD><TD PORT="message_start_time_size">8</TD><TD>u8le</TD><TD PORT="message_start_time_type">message_start_time</TD></TR>
				<TR><TD PORT="message_end_time_pos">8</TD><TD PORT="message_end_time_size">8</TD><TD>u8le</TD><TD PORT="message_end_time_type">message_end_time</TD></TR>
				<TR><TD PORT="ofs_chunk_pos">16</TD><TD PORT="ofs_chunk_size">8</TD><TD>u8le</TD><TD PORT="ofs_chunk_type">ofs_chunk</TD></TR>
				<TR><TD PORT="len_chunk_pos">24</TD><TD PORT="len_chunk_size">8</TD><TD>u8le</TD><TD PORT="len_chunk_type">len_chunk</TD></TR>
				<TR><TD PORT="len_message_index_offsets_pos">32</TD><TD PORT="len_message_index_offsets_size">4</TD><TD>u4le</TD><TD PORT="len_message_index_offsets_type">len_message_index_offsets</TD></TR>
				<TR><TD PORT="message_index_offsets_pos">36</TD><TD PORT="message_index_offsets_size">len_message_index_offsets</TD><TD>MessageIndexOffsets</TD><TD PORT="message_index_offsets_type">message_index_offsets</TD></TR>
				<TR><TD PORT="message_index_length_pos">...</TD><TD PORT="message_index_length_size">8</TD><TD>u8le</TD><TD PORT="message_index_length_type">message_index_length</TD></TR>
				<TR><TD PORT="compression_pos">...</TD><TD PORT="compression_size">...</TD><TD>PrefixedStr</TD><TD PORT="compression_type">compression</TD></TR>
				<TR><TD PORT="compressed_size_pos">...</TD><TD PORT="compressed_size_size">8</TD><TD>u8le</TD><TD PORT="compressed_size_type">compressed_size</TD></TR>
				<TR><TD PORT="uncompressed_size_pos">...</TD><TD PORT="uncompressed_size_size">8</TD><TD>u8le</TD><TD PORT="uncompressed_size_type">uncompressed_size</TD></TR>
			</TABLE>>];
			chunk_index__inst__chunk [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="chunk_pos">ofs_chunk</TD><TD PORT="chunk_size">len_chunk</TD><TD>Record</TD><TD PORT="chunk_type">chunk</TD></TR>
			</TABLE>>];
			subgraph cluster__message_index_offset {
				label="Mcap::ChunkIndex::MessageIndexOffset";
				graph[style=dotted];

				message_index_offset__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="channel_id_pos">0</TD><TD PORT="channel_id_size">2</TD><TD>u2le</TD><TD PORT="channel_id_type">channel_id</TD></TR>
					<TR><TD PORT="offset_pos">2</TD><TD PORT="offset_size">8</TD><TD>u8le</TD><TD PORT="offset_type">offset</TD></TR>
				</TABLE>>];
			}
			subgraph cluster__message_index_offsets {
				label="Mcap::ChunkIndex::MessageIndexOffsets";
				graph[style=dotted];

				message_index_offsets__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="entries_pos">0</TD><TD PORT="entries_size">10</TD><TD>MessageIndexOffset</TD><TD PORT="entries_type">entries</TD></TR>
					<TR><TD COLSPAN="4" PORT="entries__repeat">repeat to end of stream</TD></TR>
				</TABLE>>];
			}
		}
		subgraph cluster__data_end {
			label="Mcap::DataEnd";
			graph[style=dotted];

			data_end__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="data_section_crc32_pos">0</TD><TD PORT="data_section_crc32_size">4</TD><TD>u4le</TD><TD PORT="data_section_crc32_type">data_section_crc32</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__footer {
			label="Mcap::Footer";
			graph[style=dotted];

			footer__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="ofs_summary_section_pos">0</TD><TD PORT="ofs_summary_section_size">8</TD><TD>u8le</TD><TD PORT="ofs_summary_section_type">ofs_summary_section</TD></TR>
				<TR><TD PORT="ofs_summary_offset_section_pos">8</TD><TD PORT="ofs_summary_offset_section_size">8</TD><TD>u8le</TD><TD PORT="ofs_summary_offset_section_type">ofs_summary_offset_section</TD></TR>
				<TR><TD PORT="summary_crc32_pos">16</TD><TD PORT="summary_crc32_size">4</TD><TD>u4le</TD><TD PORT="summary_crc32_type">summary_crc32</TD></TR>
			</TABLE>>];
			footer__inst__ofs_summary_crc32_input [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>ofs_summary_crc32_input</TD><TD>(ofs_summary_section != 0 ? ofs_summary_section : _root.ofs_footer)</TD></TR>
			</TABLE>>];
			footer__inst__summary_crc32_input [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="summary_crc32_input_pos">ofs_summary_crc32_input</TD><TD PORT="summary_crc32_input_size">((_root._io.size - ofs_summary_crc32_input) - 8) - 4</TD><TD></TD><TD PORT="summary_crc32_input_type">summary_crc32_input</TD></TR>
			</TABLE>>];
			footer__inst__summary_offset_section [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="summary_offset_section_pos">ofs_summary_offset_section</TD><TD PORT="summary_offset_section_size">_root.ofs_footer - ofs_summary_offset_section</TD><TD>Records</TD><TD PORT="summary_offset_section_type">summary_offset_section</TD></TR>
				<TR><TD COLSPAN="4" PORT="summary_offset_section__if">if ofs_summary_offset_section != 0</TD></TR>
			</TABLE>>];
			footer__inst__summary_section [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="summary_section_pos">ofs_summary_section</TD><TD PORT="summary_section_size">(ofs_summary_offset_section != 0 ? ofs_summary_offset_section : _root.ofs_footer) - ofs_summary_section</TD><TD>Records</TD><TD PORT="summary_section_type">summary_section</TD></TR>
				<TR><TD COLSPAN="4" PORT="summary_section__if">if ofs_summary_section != 0</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__header {
			label="Mcap::Header";
			graph[style=dotted];

			header__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="profile_pos">0</TD><TD PORT="profile_size">...</TD><TD>PrefixedStr</TD><TD PORT="profile_type">profile</TD></TR>
				<TR><TD PORT="library_pos">...</TD><TD PORT="library_size">...</TD><TD>PrefixedStr</TD><TD PORT="library_type">library</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__magic {
			label="Mcap::Magic";
			graph[style=dotted];

			magic__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="magic_pos">0</TD><TD PORT="magic_size">8</TD><TD>89 4D 43 41 50 30 0D 0A</TD><TD PORT="magic_type">magic</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__map_str_str {
			label="Mcap::MapStrStr";
			graph[style=dotted];

			map_str_str__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_entries_pos">0</TD><TD PORT="len_entries_size">4</TD><TD>u4le</TD><TD PORT="len_entries_type">len_entries</TD></TR>
				<TR><TD PORT="entries_pos">4</TD><TD PORT="entries_size">len_entries</TD><TD>Entries</TD><TD PORT="entries_type">entries</TD></TR>
			</TABLE>>];
			subgraph cluster__entries {
				label="Mcap::MapStrStr::Entries";
				graph[style=dotted];

				entries__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="entries_pos">0</TD><TD PORT="entries_size">...</TD><TD>TupleStrStr</TD><TD PORT="entries_type">entries</TD></TR>
					<TR><TD COLSPAN="4" PORT="entries__repeat">repeat to end of stream</TD></TR>
				</TABLE>>];
			}
		}
		subgraph cluster__message {
			label="Mcap::Message";
			graph[style=dotted];

			message__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="channel_id_pos">0</TD><TD PORT="channel_id_size">2</TD><TD>u2le</TD><TD PORT="channel_id_type">channel_id</TD></TR>
				<TR><TD PORT="sequence_pos">2</TD><TD PORT="sequence_size">4</TD><TD>u4le</TD><TD PORT="sequence_type">sequence</TD></TR>
				<TR><TD PORT="log_time_pos">6</TD><TD PORT="log_time_size">8</TD><TD>u8le</TD><TD PORT="log_time_type">log_time</TD></TR>
				<TR><TD PORT="publish_time_pos">14</TD><TD PORT="publish_time_size">8</TD><TD>u8le</TD><TD PORT="publish_time_type">publish_time</TD></TR>
				<TR><TD PORT="data_pos">22</TD><TD PORT="data_size"></TD><TD></TD><TD PORT="data_type">data</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__message_index {
			label="Mcap::MessageIndex";
			graph[style=dotted];

			message_index__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="channel_id_pos">0</TD><TD PORT="channel_id_size">2</TD><TD>u2le</TD><TD PORT="channel_id_type">channel_id</TD></TR>
				<TR><TD PORT="len_records_pos">2</TD><TD PORT="len_records_size">4</TD><TD>u4le</TD><TD PORT="len_records_type">len_records</TD></TR>
				<TR><TD PORT="records_pos">6</TD><TD PORT="records_size">len_records</TD><TD>MessageIndexEntries</TD><TD PORT="records_type">records</TD></TR>
			</TABLE>>];
			subgraph cluster__message_index_entries {
				label="Mcap::MessageIndex::MessageIndexEntries";
				graph[style=dotted];

				message_index_entries__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="entries_pos">0</TD><TD PORT="entries_size">16</TD><TD>MessageIndexEntry</TD><TD PORT="entries_type">entries</TD></TR>
					<TR><TD COLSPAN="4" PORT="entries__repeat">repeat to end of stream</TD></TR>
				</TABLE>>];
			}
			subgraph cluster__message_index_entry {
				label="Mcap::MessageIndex::MessageIndexEntry";
				graph[style=dotted];

				message_index_entry__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="log_time_pos">0</TD><TD PORT="log_time_size">8</TD><TD>u8le</TD><TD PORT="log_time_type">log_time</TD></TR>
					<TR><TD PORT="offset_pos">8</TD><TD PORT="offset_size">8</TD><TD>u8le</TD><TD PORT="offset_type">offset</TD></TR>
				</TABLE>>];
			}
		}
		subgraph cluster__metadata {
			label="Mcap::Metadata";
			graph[style=dotted];

			metadata__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="name_pos">0</TD><TD PORT="name_size">...</TD><TD>PrefixedStr</TD><TD PORT="name_type">name</TD></TR>
				<TR><TD PORT="metadata_pos">...</TD><TD PORT="metadata_size">...</TD><TD>MapStrStr</TD><TD PORT="metadata_type">metadata</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__metadata_index {
			label="Mcap::MetadataIndex";
			graph[style=dotted];

			metadata_index__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="ofs_metadata_pos">0</TD><TD PORT="ofs_metadata_size">8</TD><TD>u8le</TD><TD PORT="ofs_metadata_type">ofs_metadata</TD></TR>
				<TR><TD PORT="len_metadata_pos">8</TD><TD PORT="len_metadata_size">8</TD><TD>u8le</TD><TD PORT="len_metadata_type">len_metadata</TD></TR>
				<TR><TD PORT="name_pos">16</TD><TD PORT="name_size">...</TD><TD>PrefixedStr</TD><TD PORT="name_type">name</TD></TR>
			</TABLE>>];
			metadata_index__inst__metadata [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="metadata_pos">ofs_metadata</TD><TD PORT="metadata_size">len_metadata</TD><TD>Record</TD><TD PORT="metadata_type">metadata</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__prefixed_str {
			label="Mcap::PrefixedStr";
			graph[style=dotted];

			prefixed_str__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_str_pos">0</TD><TD PORT="len_str_size">4</TD><TD>u4le</TD><TD PORT="len_str_type">len_str</TD></TR>
				<TR><TD PORT="str_pos">4</TD><TD PORT="str_size">len_str</TD><TD>str(UTF-8)</TD><TD PORT="str_type">str</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__record {
			label="Mcap::Record";
			graph[style=dotted];

			record__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="op_pos">0</TD><TD PORT="op_size">1</TD><TD>u1→Opcode</TD><TD PORT="op_type">op</TD></TR>
				<TR><TD PORT="len_body_pos">1</TD><TD PORT="len_body_size">8</TD><TD>u8le</TD><TD PORT="len_body_type">len_body</TD></TR>
				<TR><TD PORT="body_pos">9</TD><TD PORT="body_size">...</TD><TD>switch (op)</TD><TD PORT="body_type">body</TD></TR>
			</TABLE>>];
record__seq_body_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
	<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
	<TR><TD>:opcode_attachment</TD><TD PORT="case0">Attachment</TD></TR>
	<TR><TD>:opcode_attachment_index</TD><TD PORT="case1">AttachmentIndex</TD></TR>
	<TR><TD>:opcode_channel</TD><TD PORT="case2">Channel</TD></TR>
	<TR><TD>:opcode_chunk</TD><TD PORT="case3">Chunk</TD></TR>
	<TR><TD>:opcode_chunk_index</TD><TD PORT="case4">ChunkIndex</TD></TR>
	<TR><TD>:opcode_data_end</TD><TD PORT="case5">DataEnd</TD></TR>
	<TR><TD>:opcode_footer</TD><TD PORT="case6">Footer</TD></TR>
	<TR><TD>:opcode_header</TD><TD PORT="case7">Header</TD></TR>
	<TR><TD>:opcode_message</TD><TD PORT="case8">Message</TD></TR>
	<TR><TD>:opcode_message_index</TD><TD PORT="case9">MessageIndex</TD></TR>
	<TR><TD>:opcode_metadata</TD><TD PORT="case10">Metadata</TD></TR>
	<TR><TD>:opcode_metadata_index</TD><TD PORT="case11">MetadataIndex</TD></TR>
	<TR><TD>:opcode_schema</TD><TD PORT="case12">Schema</TD></TR>
	<TR><TD>:opcode_statistics</TD><TD PORT="case13">Statistics</TD></TR>
	<TR><TD>:opcode_summary_offset</TD><TD PORT="case14">SummaryOffset</TD></TR>
</TABLE>>];
		}
		subgraph cluster__records {
			label="Mcap::Records";
			graph[style=dotted];

			records__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="records_pos">0</TD><TD PORT="records_size">...</TD><TD>Record</TD><TD PORT="records_type">records</TD></TR>
				<TR><TD COLSPAN="4" PORT="records__repeat">repeat to end of stream</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__schema {
			label="Mcap::Schema";
			graph[style=dotted];

			schema__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="id_pos">0</TD><TD PORT="id_size">2</TD><TD>u2le</TD><TD PORT="id_type">id</TD></TR>
				<TR><TD PORT="name_pos">2</TD><TD PORT="name_size">...</TD><TD>PrefixedStr</TD><TD PORT="name_type">name</TD></TR>
				<TR><TD PORT="encoding_pos">...</TD><TD PORT="encoding_size">...</TD><TD>PrefixedStr</TD><TD PORT="encoding_type">encoding</TD></TR>
				<TR><TD PORT="len_data_pos">...</TD><TD PORT="len_data_size">4</TD><TD>u4le</TD><TD PORT="len_data_type">len_data</TD></TR>
				<TR><TD PORT="data_pos">...</TD><TD PORT="data_size">len_data</TD><TD></TD><TD PORT="data_type">data</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__statistics {
			label="Mcap::Statistics";
			graph[style=dotted];

			statistics__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="message_count_pos">0</TD><TD PORT="message_count_size">8</TD><TD>u8le</TD><TD PORT="message_count_type">message_count</TD></TR>
				<TR><TD PORT="schema_count_pos">8</TD><TD PORT="schema_count_size">2</TD><TD>u2le</TD><TD PORT="schema_count_type">schema_count</TD></TR>
				<TR><TD PORT="channel_count_pos">10</TD><TD PORT="channel_count_size">4</TD><TD>u4le</TD><TD PORT="channel_count_type">channel_count</TD></TR>
				<TR><TD PORT="attachment_count_pos">14</TD><TD PORT="attachment_count_size">4</TD><TD>u4le</TD><TD PORT="attachment_count_type">attachment_count</TD></TR>
				<TR><TD PORT="metadata_count_pos">18</TD><TD PORT="metadata_count_size">4</TD><TD>u4le</TD><TD PORT="metadata_count_type">metadata_count</TD></TR>
				<TR><TD PORT="chunk_count_pos">22</TD><TD PORT="chunk_count_size">4</TD><TD>u4le</TD><TD PORT="chunk_count_type">chunk_count</TD></TR>
				<TR><TD PORT="message_start_time_pos">26</TD><TD PORT="message_start_time_size">8</TD><TD>u8le</TD><TD PORT="message_start_time_type">message_start_time</TD></TR>
				<TR><TD PORT="message_end_time_pos">34</TD><TD PORT="message_end_time_size">8</TD><TD>u8le</TD><TD PORT="message_end_time_type">message_end_time</TD></TR>
				<TR><TD PORT="len_channel_message_counts_pos">42</TD><TD PORT="len_channel_message_counts_size">4</TD><TD>u4le</TD><TD PORT="len_channel_message_counts_type">len_channel_message_counts</TD></TR>
				<TR><TD PORT="channel_message_counts_pos">46</TD><TD PORT="channel_message_counts_size">len_channel_message_counts</TD><TD>ChannelMessageCounts</TD><TD PORT="channel_message_counts_type">channel_message_counts</TD></TR>
			</TABLE>>];
			subgraph cluster__channel_message_count {
				label="Mcap::Statistics::ChannelMessageCount";
				graph[style=dotted];

				channel_message_count__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="channel_id_pos">0</TD><TD PORT="channel_id_size">2</TD><TD>u2le</TD><TD PORT="channel_id_type">channel_id</TD></TR>
					<TR><TD PORT="message_count_pos">2</TD><TD PORT="message_count_size">8</TD><TD>u8le</TD><TD PORT="message_count_type">message_count</TD></TR>
				</TABLE>>];
			}
			subgraph cluster__channel_message_counts {
				label="Mcap::Statistics::ChannelMessageCounts";
				graph[style=dotted];

				channel_message_counts__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="entries_pos">0</TD><TD PORT="entries_size">10</TD><TD>ChannelMessageCount</TD><TD PORT="entries_type">entries</TD></TR>
					<TR><TD COLSPAN="4" PORT="entries__repeat">repeat to end of stream</TD></TR>
				</TABLE>>];
			}
		}
		subgraph cluster__summary_offset {
			label="Mcap::SummaryOffset";
			graph[style=dotted];

			summary_offset__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="group_opcode_pos">0</TD><TD PORT="group_opcode_size">1</TD><TD>u1→Opcode</TD><TD PORT="group_opcode_type">group_opcode</TD></TR>
				<TR><TD PORT="ofs_group_pos">1</TD><TD PORT="ofs_group_size">8</TD><TD>u8le</TD><TD PORT="ofs_group_type">ofs_group</TD></TR>
				<TR><TD PORT="len_group_pos">9</TD><TD PORT="len_group_size">8</TD><TD>u8le</TD><TD PORT="len_group_type">len_group</TD></TR>
			</TABLE>>];
			summary_offset__inst__group [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="group_pos">ofs_group</TD><TD PORT="group_size">len_group</TD><TD>Records</TD><TD PORT="group_type">group</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__tuple_str_str {
			label="Mcap::TupleStrStr";
			graph[style=dotted];

			tuple_str_str__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="key_pos">0</TD><TD PORT="key_size">...</TD><TD>PrefixedStr</TD><TD PORT="key_type">key</TD></TR>
				<TR><TD PORT="value_pos">...</TD><TD PORT="value_size">...</TD><TD>PrefixedStr</TD><TD PORT="value_type">value</TD></TR>
			</TABLE>>];
		}
	}
	mcap__seq:header_magic_type -> magic__seq [style=bold];
	mcap__seq:records_type -> record__seq [style=bold];
	record__seq:op_type -> mcap__seq:records__repeat [color="#404040"];
	mcap__seq:footer_magic_type -> magic__seq [style=bold];
	mcap__inst__ofs_footer:ofs_footer_type -> mcap__inst__footer:footer_pos [color="#404040"];
	mcap__inst__footer:footer_type -> record__seq [style=bold];
	record__seq:op_size -> mcap__inst__ofs_footer [color="#404040"];
	record__seq:len_body_size -> mcap__inst__ofs_footer [color="#404040"];
	attachment__seq:name_type -> prefixed_str__seq [style=bold];
	attachment__seq:content_type_type -> prefixed_str__seq [style=bold];
	attachment__seq:len_data_type -> attachment__seq:data_size [color="#404040"];
	attachment__inst__crc32_input_end:crc32_input_end_type -> attachment__seq:invoke_crc32_input_end__if [color="#404040"];
	attachment__inst__crc32_input_end:crc32_input_end_type -> attachment__inst__crc32_input:crc32_input_size [color="#404040"];
	attachment_index__seq:name_type -> prefixed_str__seq [style=bold];
	attachment_index__seq:content_type_type -> prefixed_str__seq [style=bold];
	attachment_index__seq:ofs_attachment_type -> attachment_index__inst__attachment:attachment_pos [color="#404040"];
	attachment_index__seq:len_attachment_type -> attachment_index__inst__attachment:attachment_size [color="#404040"];
	attachment_index__inst__attachment:attachment_type -> record__seq [style=bold];
	channel__seq:topic_type -> prefixed_str__seq [style=bold];
	channel__seq:message_encoding_type -> prefixed_str__seq [style=bold];
	channel__seq:metadata_type -> map_str_str__seq [style=bold];
	chunk__seq:compression_type -> prefixed_str__seq [style=bold];
	chunk__seq:records_type -> chunk__seq_records_switch [style=bold];
	chunk__seq_records_switch:case0 -> records__seq [style=bold];
	prefixed_str__seq:str_type -> chunk__seq:records_type [color="#404040"];
	chunk_index__seq:len_message_index_offsets_type -> chunk_index__seq:message_index_offsets_size [color="#404040"];
	chunk_index__seq:message_index_offsets_type -> message_index_offsets__seq [style=bold];
	chunk_index__seq:compression_type -> prefixed_str__seq [style=bold];
	chunk_index__seq:ofs_chunk_type -> chunk_index__inst__chunk:chunk_pos [color="#404040"];
	chunk_index__seq:len_chunk_type -> chunk_index__inst__chunk:chunk_size [color="#404040"];
	chunk_index__inst__chunk:chunk_type -> record__seq [style=bold];
	message_index_offsets__seq:entries_type -> message_index_offset__seq [style=bold];
	footer__seq:ofs_summary_section_type -> footer__inst__ofs_summary_crc32_input [color="#404040"];
	mcap__inst__ofs_footer:ofs_footer_type -> footer__inst__ofs_summary_crc32_input [color="#404040"];
	footer__inst__ofs_summary_crc32_input:ofs_summary_crc32_input_type -> footer__inst__summary_crc32_input:summary_crc32_input_pos [color="#404040"];
	footer__inst__ofs_summary_crc32_input:ofs_summary_crc32_input_type -> footer__inst__summary_crc32_input:summary_crc32_input_size [color="#404040"];
	footer__seq:summary_crc32_size -> footer__inst__summary_crc32_input:summary_crc32_input_size [color="#404040"];
	footer__seq:ofs_summary_offset_section_type -> footer__inst__summary_offset_section:summary_offset_section_pos [color="#404040"];
	mcap__inst__ofs_footer:ofs_footer_type -> footer__inst__summary_offset_section:summary_offset_section_size [color="#404040"];
	footer__seq:ofs_summary_offset_section_type -> footer__inst__summary_offset_section:summary_offset_section_size [color="#404040"];
	footer__inst__summary_offset_section:summary_offset_section_type -> records__seq [style=bold];
	footer__seq:ofs_summary_offset_section_type -> footer__inst__summary_offset_section:summary_offset_section__if [color="#404040"];
	footer__seq:ofs_summary_section_type -> footer__inst__summary_section:summary_section_pos [color="#404040"];
	footer__seq:ofs_summary_offset_section_type -> footer__inst__summary_section:summary_section_size [color="#404040"];
	mcap__inst__ofs_footer:ofs_footer_type -> footer__inst__summary_section:summary_section_size [color="#404040"];
	footer__seq:ofs_summary_section_type -> footer__inst__summary_section:summary_section_size [color="#404040"];
	footer__inst__summary_section:summary_section_type -> records__seq [style=bold];
	footer__seq:ofs_summary_section_type -> footer__inst__summary_section:summary_section__if [color="#404040"];
	header__seq:profile_type -> prefixed_str__seq [style=bold];
	header__seq:library_type -> prefixed_str__seq [style=bold];
	map_str_str__seq:len_entries_type -> map_str_str__seq:entries_size [color="#404040"];
	map_str_str__seq:entries_type -> entries__seq [style=bold];
	entries__seq:entries_type -> tuple_str_str__seq [style=bold];
	message_index__seq:len_records_type -> message_index__seq:records_size [color="#404040"];
	message_index__seq:records_type -> message_index_entries__seq [style=bold];
	message_index_entries__seq:entries_type -> message_index_entry__seq [style=bold];
	metadata__seq:name_type -> prefixed_str__seq [style=bold];
	metadata__seq:metadata_type -> map_str_str__seq [style=bold];
	metadata_index__seq:name_type -> prefixed_str__seq [style=bold];
	metadata_index__seq:ofs_metadata_type -> metadata_index__inst__metadata:metadata_pos [color="#404040"];
	metadata_index__seq:len_metadata_type -> metadata_index__inst__metadata:metadata_size [color="#404040"];
	metadata_index__inst__metadata:metadata_type -> record__seq [style=bold];
	prefixed_str__seq:len_str_type -> prefixed_str__seq:str_size [color="#404040"];
	record__seq:body_type -> record__seq_body_switch [style=bold];
	record__seq_body_switch:case0 -> attachment__seq [style=bold];
	record__seq_body_switch:case1 -> attachment_index__seq [style=bold];
	record__seq_body_switch:case2 -> channel__seq [style=bold];
	record__seq_body_switch:case3 -> chunk__seq [style=bold];
	record__seq_body_switch:case4 -> chunk_index__seq [style=bold];
	record__seq_body_switch:case5 -> data_end__seq [style=bold];
	record__seq_body_switch:case6 -> footer__seq [style=bold];
	record__seq_body_switch:case7 -> header__seq [style=bold];
	record__seq_body_switch:case8 -> message__seq [style=bold];
	record__seq_body_switch:case9 -> message_index__seq [style=bold];
	record__seq_body_switch:case10 -> metadata__seq [style=bold];
	record__seq_body_switch:case11 -> metadata_index__seq [style=bold];
	record__seq_body_switch:case12 -> schema__seq [style=bold];
	record__seq_body_switch:case13 -> statistics__seq [style=bold];
	record__seq_body_switch:case14 -> summary_offset__seq [style=bold];
	record__seq:op_type -> record__seq:body_type [color="#404040"];
	records__seq:records_type -> record__seq [style=bold];
	schema__seq:name_type -> prefixed_str__seq [style=bold];
	schema__seq:encoding_type -> prefixed_str__seq [style=bold];
	schema__seq:len_data_type -> schema__seq:data_size [color="#404040"];
	statistics__seq:len_channel_message_counts_type -> statistics__seq:channel_message_counts_size [color="#404040"];
	statistics__seq:channel_message_counts_type -> channel_message_counts__seq [style=bold];
	channel_message_counts__seq:entries_type -> channel_message_count__seq [style=bold];
	summary_offset__seq:ofs_group_type -> summary_offset__inst__group:group_pos [color="#404040"];
	summary_offset__seq:len_group_type -> summary_offset__inst__group:group_size [color="#404040"];
	summary_offset__inst__group:group_type -> records__seq [style=bold];
	tuple_str_str__seq:key_type -> prefixed_str__seq [style=bold];
	tuple_str_str__seq:value_type -> prefixed_str__seq [style=bold];
}