Python Pickle format serializes Python objects to a byte stream, as a sequence of operations to run on the Pickle Virtual Machine.
The format is mostly implementation defined, there is no formal specification.
Pickle data types are closely coupled to the Python object model.
Python singletons, and most builtin types (e.g. None
, int
,dict
, list
)
are serialised using dedicated Pickle opcodes.
Other builtin types, and all classes (e.g. set
, datetime.datetime
) are
serialised by encoding the name of a constructor callable.
They are deserialised by importing that constructor, and calling it.
So, unpickling an arbitrary pickle, using the Python's stdlib pickle module
can cause arbitrary code execution.
Pickle format has evolved with Python, later protocols add opcodes & types. Later Python releases can pickle to or unpickle from any earlier protocol.
bytes
objects.set
.bytearray
and out of band dataThis page hosts a formal specification of Python pickle serialization format using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__python_pickle {
label="PythonPickle";
graph[style=dotted];
python_pickle__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="ops_pos">0</TD><TD PORT="ops_size">...</TD><TD>Op</TD><TD PORT="ops_type">ops</TD></TR>
<TR><TD COLSPAN="4" PORT="ops__repeat">repeat until _.code == :opcode_stop</TD></TR>
</TABLE>>];
subgraph cluster__unicodestring8 {
label="PythonPickle::Unicodestring8";
graph[style=dotted];
unicodestring8__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_pos">0</TD><TD PORT="len_size">8</TD><TD>u8le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">8</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__long1 {
label="PythonPickle::Long1";
graph[style=dotted];
long1__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_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__bytes8 {
label="PythonPickle::Bytes8";
graph[style=dotted];
bytes8__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_pos">0</TD><TD PORT="len_size">8</TD><TD>u8le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">8</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__bytes1 {
label="PythonPickle::Bytes1";
graph[style=dotted];
bytes1__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_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__bytes4 {
label="PythonPickle::Bytes4";
graph[style=dotted];
bytes4__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_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__no_arg {
label="PythonPickle::NoArg";
graph[style=dotted];
no_arg__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>
</TABLE>>];
}
subgraph cluster__stringnl_noescape {
label="PythonPickle::StringnlNoescape";
graph[style=dotted];
stringnl_noescape__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__decimalnl_long {
label="PythonPickle::DecimalnlLong";
graph[style=dotted];
decimalnl_long__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__unicodestring4 {
label="PythonPickle::Unicodestring4";
graph[style=dotted];
unicodestring4__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_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__unicodestringnl {
label="PythonPickle::Unicodestringnl";
graph[style=dotted];
unicodestringnl__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__long4 {
label="PythonPickle::Long4";
graph[style=dotted];
long4__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_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__string1 {
label="PythonPickle::String1";
graph[style=dotted];
string1__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_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__bytearray8 {
label="PythonPickle::Bytearray8";
graph[style=dotted];
bytearray8__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_pos">0</TD><TD PORT="len_size">8</TD><TD>u8le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">8</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__decimalnl_short {
label="PythonPickle::DecimalnlShort";
graph[style=dotted];
decimalnl_short__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__unicodestring1 {
label="PythonPickle::Unicodestring1";
graph[style=dotted];
unicodestring1__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_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__stringnl {
label="PythonPickle::Stringnl";
graph[style=dotted];
stringnl__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__stringnl_noescape_pair {
label="PythonPickle::StringnlNoescapePair";
graph[style=dotted];
stringnl_noescape_pair__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="val1_pos">0</TD><TD PORT="val1_size">...</TD><TD>StringnlNoescape</TD><TD PORT="val1_type">val1</TD></TR>
<TR><TD PORT="val2_pos">...</TD><TD PORT="val2_size">...</TD><TD>StringnlNoescape</TD><TD PORT="val2_type">val2</TD></TR>
</TABLE>>];
}
subgraph cluster__string4 {
label="PythonPickle::String4";
graph[style=dotted];
string4__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_pos">0</TD><TD PORT="len_size">4</TD><TD>s4le</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
subgraph cluster__op {
label="PythonPickle::Op";
graph[style=dotted];
op__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="code_pos">0</TD><TD PORT="code_size">1</TD><TD>u1→Opcode</TD><TD PORT="code_type">code</TD></TR>
<TR><TD PORT="arg_pos">1</TD><TD PORT="arg_size">...</TD><TD>switch (code)</TD><TD PORT="arg_type">arg</TD></TR>
</TABLE>>];
op__seq_arg_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>:opcode_tuple1</TD><TD PORT="case0">NoArg</TD></TR>
<TR><TD>:opcode_setitem</TD><TD PORT="case1">NoArg</TD></TR>
<TR><TD>:opcode_readonly_buffer</TD><TD PORT="case2">NoArg</TD></TR>
<TR><TD>:opcode_stop</TD><TD PORT="case3">NoArg</TD></TR>
<TR><TD>:opcode_empty_tuple</TD><TD PORT="case4">NoArg</TD></TR>
<TR><TD>:opcode_newtrue</TD><TD PORT="case5">NoArg</TD></TR>
<TR><TD>:opcode_long</TD><TD PORT="case6">DecimalnlLong</TD></TR>
<TR><TD>:opcode_newobj</TD><TD PORT="case7">NoArg</TD></TR>
<TR><TD>:opcode_bytearray8</TD><TD PORT="case8">Bytearray8</TD></TR>
<TR><TD>:opcode_put</TD><TD PORT="case9">DecimalnlShort</TD></TR>
<TR><TD>:opcode_stack_global</TD><TD PORT="case10">NoArg</TD></TR>
<TR><TD>:opcode_pop_mark</TD><TD PORT="case11">NoArg</TD></TR>
<TR><TD>:opcode_append</TD><TD PORT="case12">NoArg</TD></TR>
<TR><TD>:opcode_newfalse</TD><TD PORT="case13">NoArg</TD></TR>
<TR><TD>:opcode_binpersid</TD><TD PORT="case14">NoArg</TD></TR>
<TR><TD>:opcode_build</TD><TD PORT="case15">NoArg</TD></TR>
<TR><TD>:opcode_empty_dict</TD><TD PORT="case16">NoArg</TD></TR>
<TR><TD>:opcode_tuple2</TD><TD PORT="case17">NoArg</TD></TR>
<TR><TD>:opcode_long4</TD><TD PORT="case18">Long4</TD></TR>
<TR><TD>:opcode_next_buffer</TD><TD PORT="case19">NoArg</TD></TR>
<TR><TD>:opcode_appends</TD><TD PORT="case20">NoArg</TD></TR>
<TR><TD>:opcode_binbytes</TD><TD PORT="case21">Bytes4</TD></TR>
<TR><TD>:opcode_dup</TD><TD PORT="case22">NoArg</TD></TR>
<TR><TD>:opcode_list</TD><TD PORT="case23">NoArg</TD></TR>
<TR><TD>:opcode_pop</TD><TD PORT="case24">NoArg</TD></TR>
<TR><TD>:opcode_string</TD><TD PORT="case25">Stringnl</TD></TR>
<TR><TD>:opcode_binunicode</TD><TD PORT="case26">Unicodestring4</TD></TR>
<TR><TD>:opcode_float</TD><TD PORT="case27">Floatnl</TD></TR>
<TR><TD>:opcode_reduce</TD><TD PORT="case28">NoArg</TD></TR>
<TR><TD>:opcode_global_opcode</TD><TD PORT="case29">StringnlNoescapePair</TD></TR>
<TR><TD>:opcode_memoize</TD><TD PORT="case30">NoArg</TD></TR>
<TR><TD>:opcode_persid</TD><TD PORT="case31">StringnlNoescape</TD></TR>
<TR><TD>:opcode_none</TD><TD PORT="case32">NoArg</TD></TR>
<TR><TD>:opcode_short_binunicode</TD><TD PORT="case33">Unicodestring1</TD></TR>
<TR><TD>:opcode_obj</TD><TD PORT="case34">NoArg</TD></TR>
<TR><TD>:opcode_newobj_ex</TD><TD PORT="case35">NoArg</TD></TR>
<TR><TD>:opcode_empty_list</TD><TD PORT="case36">NoArg</TD></TR>
<TR><TD>:opcode_tuple</TD><TD PORT="case37">NoArg</TD></TR>
<TR><TD>:opcode_binunicode8</TD><TD PORT="case38">Unicodestring8</TD></TR>
<TR><TD>:opcode_dict</TD><TD PORT="case39">NoArg</TD></TR>
<TR><TD>:opcode_binstring</TD><TD PORT="case40">String4</TD></TR>
<TR><TD>:opcode_setitems</TD><TD PORT="case41">NoArg</TD></TR>
<TR><TD>:opcode_binbytes8</TD><TD PORT="case42">Bytes8</TD></TR>
<TR><TD>:opcode_inst</TD><TD PORT="case43">StringnlNoescapePair</TD></TR>
<TR><TD>:opcode_int</TD><TD PORT="case44">DecimalnlShort</TD></TR>
<TR><TD>:opcode_unicode</TD><TD PORT="case45">Unicodestringnl</TD></TR>
<TR><TD>:opcode_long1</TD><TD PORT="case46">Long1</TD></TR>
<TR><TD>:opcode_short_binstring</TD><TD PORT="case47">String1</TD></TR>
<TR><TD>:opcode_mark</TD><TD PORT="case48">NoArg</TD></TR>
<TR><TD>:opcode_frozenset</TD><TD PORT="case49">NoArg</TD></TR>
<TR><TD>:opcode_tuple3</TD><TD PORT="case50">NoArg</TD></TR>
<TR><TD>:opcode_additems</TD><TD PORT="case51">NoArg</TD></TR>
<TR><TD>:opcode_get</TD><TD PORT="case52">DecimalnlShort</TD></TR>
<TR><TD>:opcode_empty_set</TD><TD PORT="case53">NoArg</TD></TR>
<TR><TD>:opcode_short_binbytes</TD><TD PORT="case54">Bytes1</TD></TR>
</TABLE>>];
}
subgraph cluster__floatnl {
label="PythonPickle::Floatnl";
graph[style=dotted];
floatnl__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="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
</TABLE>>];
}
}
python_pickle__seq:ops_type -> op__seq [style=bold];
op__seq:code_type -> python_pickle__seq:ops__repeat [color="#404040"];
unicodestring8__seq:len_type -> unicodestring8__seq:val_size [color="#404040"];
long1__seq:len_type -> long1__seq:val_size [color="#404040"];
bytes8__seq:len_type -> bytes8__seq:val_size [color="#404040"];
bytes1__seq:len_type -> bytes1__seq:val_size [color="#404040"];
bytes4__seq:len_type -> bytes4__seq:val_size [color="#404040"];
unicodestring4__seq:len_type -> unicodestring4__seq:val_size [color="#404040"];
long4__seq:len_type -> long4__seq:val_size [color="#404040"];
string1__seq:len_type -> string1__seq:val_size [color="#404040"];
bytearray8__seq:len_type -> bytearray8__seq:val_size [color="#404040"];
unicodestring1__seq:len_type -> unicodestring1__seq:val_size [color="#404040"];
stringnl_noescape_pair__seq:val1_type -> stringnl_noescape__seq [style=bold];
stringnl_noescape_pair__seq:val2_type -> stringnl_noescape__seq [style=bold];
string4__seq:len_type -> string4__seq:val_size [color="#404040"];
op__seq:arg_type -> op__seq_arg_switch [style=bold];
op__seq_arg_switch:case0 -> no_arg__seq [style=bold];
op__seq_arg_switch:case1 -> no_arg__seq [style=bold];
op__seq_arg_switch:case2 -> no_arg__seq [style=bold];
op__seq_arg_switch:case3 -> no_arg__seq [style=bold];
op__seq_arg_switch:case4 -> no_arg__seq [style=bold];
op__seq_arg_switch:case5 -> no_arg__seq [style=bold];
op__seq_arg_switch:case6 -> decimalnl_long__seq [style=bold];
op__seq_arg_switch:case7 -> no_arg__seq [style=bold];
op__seq_arg_switch:case8 -> bytearray8__seq [style=bold];
op__seq_arg_switch:case9 -> decimalnl_short__seq [style=bold];
op__seq_arg_switch:case10 -> no_arg__seq [style=bold];
op__seq_arg_switch:case11 -> no_arg__seq [style=bold];
op__seq_arg_switch:case12 -> no_arg__seq [style=bold];
op__seq_arg_switch:case13 -> no_arg__seq [style=bold];
op__seq_arg_switch:case14 -> no_arg__seq [style=bold];
op__seq_arg_switch:case15 -> no_arg__seq [style=bold];
op__seq_arg_switch:case16 -> no_arg__seq [style=bold];
op__seq_arg_switch:case17 -> no_arg__seq [style=bold];
op__seq_arg_switch:case18 -> long4__seq [style=bold];
op__seq_arg_switch:case19 -> no_arg__seq [style=bold];
op__seq_arg_switch:case20 -> no_arg__seq [style=bold];
op__seq_arg_switch:case21 -> bytes4__seq [style=bold];
op__seq_arg_switch:case22 -> no_arg__seq [style=bold];
op__seq_arg_switch:case23 -> no_arg__seq [style=bold];
op__seq_arg_switch:case24 -> no_arg__seq [style=bold];
op__seq_arg_switch:case25 -> stringnl__seq [style=bold];
op__seq_arg_switch:case26 -> unicodestring4__seq [style=bold];
op__seq_arg_switch:case27 -> floatnl__seq [style=bold];
op__seq_arg_switch:case28 -> no_arg__seq [style=bold];
op__seq_arg_switch:case29 -> stringnl_noescape_pair__seq [style=bold];
op__seq_arg_switch:case30 -> no_arg__seq [style=bold];
op__seq_arg_switch:case31 -> stringnl_noescape__seq [style=bold];
op__seq_arg_switch:case32 -> no_arg__seq [style=bold];
op__seq_arg_switch:case33 -> unicodestring1__seq [style=bold];
op__seq_arg_switch:case34 -> no_arg__seq [style=bold];
op__seq_arg_switch:case35 -> no_arg__seq [style=bold];
op__seq_arg_switch:case36 -> no_arg__seq [style=bold];
op__seq_arg_switch:case37 -> no_arg__seq [style=bold];
op__seq_arg_switch:case38 -> unicodestring8__seq [style=bold];
op__seq_arg_switch:case39 -> no_arg__seq [style=bold];
op__seq_arg_switch:case40 -> string4__seq [style=bold];
op__seq_arg_switch:case41 -> no_arg__seq [style=bold];
op__seq_arg_switch:case42 -> bytes8__seq [style=bold];
op__seq_arg_switch:case43 -> stringnl_noescape_pair__seq [style=bold];
op__seq_arg_switch:case44 -> decimalnl_short__seq [style=bold];
op__seq_arg_switch:case45 -> unicodestringnl__seq [style=bold];
op__seq_arg_switch:case46 -> long1__seq [style=bold];
op__seq_arg_switch:case47 -> string1__seq [style=bold];
op__seq_arg_switch:case48 -> no_arg__seq [style=bold];
op__seq_arg_switch:case49 -> no_arg__seq [style=bold];
op__seq_arg_switch:case50 -> no_arg__seq [style=bold];
op__seq_arg_switch:case51 -> no_arg__seq [style=bold];
op__seq_arg_switch:case52 -> decimalnl_short__seq [style=bold];
op__seq_arg_switch:case53 -> no_arg__seq [style=bold];
op__seq_arg_switch:case54 -> bytes1__seq [style=bold];
op__seq:code_type -> op__seq:arg_type [color="#404040"];
}