€•MJŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ#/translations/zh_CN/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/zh_TW/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/it_IT/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ja_JP/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ko_KR/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/pt_BR/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/sp_SP/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ=/var/lib/git/docbuild/linux/Documentation/bpf/map_of_maps.rst”h´Kubh¶)”}”(hŒ Copyright (C) 2022 Red Hat, Inc.”h]”hŒ Copyright (C) 2022 Red Hat, Inc.”…””}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”h]”hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´KubhŒnote”“”)”}”(hŒk- ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ paragraph”“”)”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”(hŒliteral”“”)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhþubhŒ and ”…””}”(hhþh²hh³Nh´Nubj)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhþubhŒ' were introduced in kernel version 4.12”…””}”(hhþh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhøubah}”(h]”h ]”h"]”h$]”h&]”uh1höhhóubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hñh³hÇh´K hhíubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³Nh´Nubhý)”}”(hX ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ``array_of_maps->sock_map``.”h]”(j)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ and ”…””}”(hjBh²hh³Nh´Nubj)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ­ provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ”…””}”(hjBh²hh³Nh´Nubj)”}”(hŒ``array_of_maps->sock_map``”h]”hŒarray_of_maps->sock_map”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ.”…””}”(hjBh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhØh²hubhý)”}”(hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”h]”hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KhhØh²hubhý)”}”(hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”h]”hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KhhØh²hubhì)”}”(hŒ¼- Multi-level nesting is not supported. - Any BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``. - A BPF program cannot update or delete outer map entries.”h]”hò)”}”(hhh]”(h÷)”}”(hŒ%Multi-level nesting is not supported.”h]”hý)”}”(hj§h]”hŒ%Multi-level nesting is not supported.”…””}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubh÷)”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”hý)”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”(hŒ9Any BPF map type can be used as an inner map, except for ”…””}”(hjÀh²hh³Nh´Nubj)”}”(hŒ``BPF_MAP_TYPE_PROG_ARRAY``”h]”hŒBPF_MAP_TYPE_PROG_ARRAY”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÀubhŒ.”…””}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubh÷)”}”(hŒ8A BPF program cannot update or delete outer map entries.”h]”hý)”}”(hjèh]”hŒ8A BPF program cannot update or delete outer map entries.”…””}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjæubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”j:j;uh1hñh³hÇh´Khjžubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³Nh´Nubhý)”}”(hŒ¾For ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ``max_entries`` elements that are zero initialized when created.”h]”(hŒFor ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ\ the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ``max_entries``”h]”hŒ max_entries”…””}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ1 elements that are zero initialized when created.”…””}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhØh²hubhý)”}”(hXmFor ``BPF_MAP_TYPE_HASH_OF_MAPS`` the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ``BPF_F_NO_PREALLOC`` flag can be used to disable pre-allocation when it is too memory expensive.”h]”(hŒFor ”…””}”(hj;h²hh³Nh´Nubj)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubhŒë the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ”…””}”(hj;h²hh³Nh´Nubj)”}”(hŒ``BPF_F_NO_PREALLOC``”h]”hŒBPF_F_NO_PREALLOC”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubhŒL flag can be used to disable pre-allocation when it is too memory expensive.”…””}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K$hhØh²hubh×)”}”(hhh]”(hÜ)”}”(hŒUsage”h]”hŒUsage”…””}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjmh²hh³hÇh´K+ubh×)”}”(hhh]”(hÜ)”}”(hŒKernel BPF Helper”h]”hŒKernel BPF Helper”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj~h²hh³hÇh´K.ubh×)”}”(hhh]”(hÜ)”}”(hŒbpf_map_lookup_elem()”h]”hŒbpf_map_lookup_elem()”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´K1ubhŒ literal_block”“”)”}”(hŒ?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)”h]”hŒ?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)”…””}”hj¢sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j h³hÇh´K3hjh²hubhý)”}”(hŒšInner maps can be retrieved using the ``bpf_map_lookup_elem()`` helper. This helper returns a pointer to the inner map, or ``NULL`` if no entry was found.”h]”(hŒ&Inner maps can be retrieved using the ”…””}”(hjµh²hh³Nh´Nubj)”}”(hŒ``bpf_map_lookup_elem()``”h]”hŒbpf_map_lookup_elem()”…””}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubhŒ< helper. This helper returns a pointer to the inner map, or ”…””}”(hjµh²hh³Nh´Nubj)”}”(hŒ``NULL``”h]”hŒNULL”…””}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubhŒ if no entry was found.”…””}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K7hjh²hubeh}”(h]”Œbpf-map-lookup-elem”ah ]”h"]”Œbpf_map_lookup_elem()”ah$]”h&]”uh1hÖhj~h²hh³hÇh´K1ubeh}”(h]”Œkernel-bpf-helper”ah ]”h"]”Œkernel bpf helper”ah$]”h&]”uh1hÖhjmh²hh³hÇh´K.ubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K+ubh×)”}”(hhh]”(hÜ)”}”(hŒExamples”h]”hŒExamples”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÿh²hh³hÇh´K;ubh×)”}”(hhh]”(hÜ)”}”(hŒKernel BPF Example”h]”hŒKernel BPF Example”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´K>ubhý)”}”(hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”h]”hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”…””}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K@hjh²hubj¡)”}”(hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”h]”hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”…””}”hj/sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´KDhjh²hubhý)”}”(hŒ…See ``progs/test_btf_map_in_map.c`` in ``tools/testing/selftests/bpf`` for more examples of declarative initialisation of outer maps.”h]”(hŒSee ”…””}”(hj>h²hh³Nh´Nubj)”}”(hŒ``progs/test_btf_map_in_map.c``”h]”hŒprogs/test_btf_map_in_map.c”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>ubhŒ in ”…””}”(hj>h²hh³Nh´Nubj)”}”(hŒ``tools/testing/selftests/bpf``”h]”hŒtools/testing/selftests/bpf”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>ubhŒ? for more examples of declarative initialisation of outer maps.”…””}”(hj>h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KWhjh²hubeh}”(h]”Œkernel-bpf-example”ah ]”h"]”Œkernel bpf example”ah$]”h&]”uh1hÖhjÿh²hh³hÇh´K>ubh×)”}”(hhh]”(hÜ)”}”(hŒ User Space”h]”hŒ User Space”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjxh²hh³hÇh´K[ubhý)”}”(hŒ:This snippet shows how to create an array based outer map:”h]”hŒ:This snippet shows how to create an array based outer map:”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K]hjxh²hubj¡)”}”(hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”h]”hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”…””}”hj—sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´K_hjxh²hubhý)”}”(hŒ;This snippet shows how to add an inner map to an outer map:”h]”hŒ;This snippet shows how to add an inner map to an outer map:”…””}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kohjxh²hubj¡)”}”(hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”h]”hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”…””}”hj´sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´Kqhjxh²hubeh}”(h]”Œ user-space”ah ]”h"]”Œ user space”ah$]”h&]”uh1hÖhjÿh²hh³hÇh´K[ubeh}”(h]”Œexamples”ah ]”h"]”Œexamples”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K;ubh×)”}”(hhh]”(hÜ)”}”(hŒ References”h]”hŒ References”…””}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÓh²hh³hÇh´Kubhò)”}”(hhh]”(h÷)”}”(hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”h]”hý)”}”(hjéh]”hŒ reference”“”)”}”(hjéh]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jéuh1jîhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjçubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjäh²hh³hÇh´Nubh÷)”}”(hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”h]”hý)”}”(hj h]”jï)”}”(hj h]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j uh1jîhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K‚hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjäh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j:j;uh1hñh³hÇh´KhjÓh²hubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kubeh}”(h]”Œ8bpf-map-type-array-of-maps-and-bpf-map-type-hash-of-maps”ah ]”h"]”Œ8bpf_map_type_array_of_maps and bpf_map_type_hash_of_maps”ah$]”h&]”uh1hÖhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÛNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jdŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j>j;jüjùjôjñjìjéjÐjÍjujrjÈjÅj6j3uŒ nametypes”}”(j>‰jü‰jô‰jì‰jЉju‰jȉj6‰uh}”(j;hØjùjmjñj~jéjjÍjÿjrjjÅjxj3jÓuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.