€•}VŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”(hhŒparent”hubaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ)/translations/zh_CN/core-api/printk-index”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”(hhhh2ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/zh_TW/core-api/printk-index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”(hhhhFubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/it_IT/core-api/printk-index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”(hhhhZubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ja_JP/core-api/printk-index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”(hhhhnubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ko_KR/core-api/printk-index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”(hhhh‚ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/sp_SP/core-api/printk-index”Œ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”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”(hhhh£ubah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h¡hhhžhhŸŒC/var/lib/git/docbuild/linux/Documentation/core-api/printk-index.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ Printk Index”h]”hŒ Printk Index”…””}”(hh½hh»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hh¶hžhhŸh³h KubhŒ paragraph”“”)”}”(hŒÎThere are many ways to monitor the state of the system. One important source of information is the system log. It provides a lot of information, including more or less important warnings and error messages.”h]”hŒÎThere are many ways to monitor the state of the system. One important source of information is the system log. It provides a lot of information, including more or less important warnings and error messages.”…””}”(hhÍhhËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hŒPThere are monitoring tools that filter and take action based on messages logged.”h]”hŒPThere are monitoring tools that filter and take action based on messages logged.”…””}”(hhÛhhÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K hh¶hžhubhÊ)”}”(hŒ€The kernel messages are evolving together with the code. As a result, particular kernel messages are not KABI and never will be!”h]”hŒ€The kernel messages are evolving together with the code. As a result, particular kernel messages are not KABI and never will be!”…””}”(hhéhhçhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hX¨It is a huge challenge for maintaining the system log monitors. It requires knowing what messages were updated in a particular kernel version and why. Finding these changes in the sources would require non-trivial parsers. Also it would require matching the sources with the binary kernel which is not always trivial. Various changes might be backported. Various kernel versions might be used on different monitored systems.”h]”hX¨It is a huge challenge for maintaining the system log monitors. It requires knowing what messages were updated in a particular kernel version and why. Finding these changes in the sources would require non-trivial parsers. Also it would require matching the sources with the binary kernel which is not always trivial. Various changes might be backported. Various kernel versions might be used on different monitored systems.”…””}”(hh÷hhõhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hŒÞThis is where the printk index feature might become useful. It provides a dump of printk formats used all over the source code used for the kernel and modules on the running system. It is accessible at runtime via debugfs.”h]”hŒÞThis is where the printk index feature might become useful. It provides a dump of printk formats used all over the source code used for the kernel and modules on the running system. It is accessible at runtime via debugfs.”…””}”(hjhjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hŒ”The printk index helps to find changes in the message formats. Also it helps to track the strings back to the kernel sources and the related commit.”h]”hŒ”The printk index helps to find changes in the message formats. Also it helps to track the strings back to the kernel sources and the related commit.”…””}”(hjhjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhµ)”}”(hhh]”(hº)”}”(hŒUser Interface”h]”hŒUser Interface”…””}”(hj$hj"hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h K!ubhÊ)”}”(hŒ×The index of printk formats are split in into separate files. The files are named according to the binaries where the printk formats are built-in. There is always "vmlinux" and optionally also modules, for example::”h]”hŒÚThe index of printk formats are split in into separate files. The files are named according to the binaries where the printk formats are built-in. There is always “vmlinux†and optionally also modules, for example:”…””}”(hŒÖThe index of printk formats are split in into separate files. The files are named according to the binaries where the printk formats are built-in. There is always "vmlinux" and optionally also modules, for example:”hj0hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K#hjhžhubhŒ literal_block”“”)”}”(hŒr/sys/kernel/debug/printk/index/vmlinux /sys/kernel/debug/printk/index/ext4 /sys/kernel/debug/printk/index/scsi_mod”h]”hŒr/sys/kernel/debug/printk/index/vmlinux /sys/kernel/debug/printk/index/ext4 /sys/kernel/debug/printk/index/scsi_mod”…””}”(hhhjAubah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j?hŸh³h K'hjhžhubhÊ)”}”(hŒNote that only loaded modules are shown. Also printk formats from a module might appear in "vmlinux" when the module is built-in.”h]”hŒ…Note that only loaded modules are shown. Also printk formats from a module might appear in “vmlinux†when the module is built-in.”…””}”(hjQhjOhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K+hjhžhubhÊ)”}”(hŒGThe content is inspired by the dynamic debug interface and looks like::”h]”hŒFThe content is inspired by the dynamic debug interface and looks like:”…””}”(hŒFThe content is inspired by the dynamic debug interface and looks like:”hj]hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K.hjhžhubj@)”}”(hX$> head -1 /sys/kernel/debug/printk/index/vmlinux; shuf -n 5 vmlinux # filename:line function "format" <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n" <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n" <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n" <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n" <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"”h]”hX$> head -1 /sys/kernel/debug/printk/index/vmlinux; shuf -n 5 vmlinux # filename:line function "format" <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n" <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n" <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n" <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n" <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"”…””}”(hhhjlubah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j?hŸh³h K0hjhžhubhÊ)”}”(hŒ, where the meaning is:”h]”hŒ, where the meaning is:”…””}”(hj|hjzhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K8hjhžhubhŒ block_quote”“”)”}”(hhh]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ|:level: log level value: 0-7 for particular severity, -1 as default, 'c' as continuous line without an explicit log level”h]”hŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒlevel”h]”hŒlevel”…””}”(hj¦hj¤hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢hjŸhŸh³h KubhŒ field_body”“”)”}”(hŒqlog level value: 0-7 for particular severity, -1 as default, 'c' as continuous line without an explicit log level”h]”hÊ)”}”(hŒqlog level value: 0-7 for particular severity, -1 as default, 'c' as continuous line without an explicit log level”h]”hŒulog level value: 0-7 for particular severity, -1 as default, ‘c’ as continuous line without an explicit log level”…””}”(hjºhj¸hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K:hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hjŸubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh³h K:hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)”}”(hŒ8:flags: optional flags: currently only 'c' for KERN_CONT”h]”j™)”}”(hhh]”jž)”}”(hhh]”(j£)”}”(hŒflags”h]”hŒflags”…””}”(hjêhjèhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢hjåhŸh³h Kubj³)”}”(hŒ0optional flags: currently only 'c' for KERN_CONT”h]”hÊ)”}”(hjøh]”hŒ4optional flags: currently only ‘c’ for KERN_CONT”…””}”(hjøhjúhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj<hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K=hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh³h K=hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)”}”(hŒ9:function: function name where the printk() call is used.”h]”j™)”}”(hhh]”jž)”}”(hhh]”(j£)”}”(hŒfunction”h]”hŒfunction”…””}”(hjnhjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢hjihŸh³h Kubj³)”}”(hŒ.function name where the printk() call is used.”h]”hÊ)”}”(hj|h]”hŒ.function name where the printk() call is used.”…””}”(hj|hj~hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K@hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh³h K@hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜hjbubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)”}”(hŒ:format: format string ”h]”j™)”}”(hhh]”jž)”}”(hhh]”(j£)”}”(hŒformat”h]”hŒformat”…””}”(hj¯hj­hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢hjªhŸh³h Kubj³)”}”(hŒformat string ”h]”hÊ)”}”(hŒ format string”h]”hŒ format string”…””}”(hjÁhj¿hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KAhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh³h KAhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜hj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jhŸh³h K:hjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhjhžhhŸNh NubhÊ)”}”(hXThe extra information makes it a bit harder to find differences between various kernels. Especially the line number might change very often. On the other hand, it helps a lot to confirm that it is the same string or find the commit that is responsible for eventual changes.”h]”hXThe extra information makes it a bit harder to find differences between various kernels. Especially the line number might change very often. On the other hand, it helps a lot to confirm that it is the same string or find the commit that is responsible for eventual changes.”…””}”(hjõhjóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KChjhžhubeh}”(h]”Œuser-interface”ah ]”h"]”Œuser interface”ah$]”h&]”uh1h´hh¶hžhhŸh³h K!ubhµ)”}”(hhh]”(hº)”}”(hŒprintk() Is Not a Stable KABI”h]”hŒprintk() Is Not a Stable KABI”…””}”(hjhj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj hžhhŸh³h KKubhÊ)”}”(hŒ•Several developers are afraid that exporting all these implementation details into the user space will transform particular printk() calls into KABI.”h]”hŒ•Several developers are afraid that exporting all these implementation details into the user space will transform particular printk() calls into KABI.”…””}”(hjhjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KMhj hžhubhÊ)”}”(hŒBut it is exactly the opposite. printk() calls must _not_ be KABI. And the printk index helps user space tools to deal with this.”h]”hŒBut it is exactly the opposite. printk() calls must _not_ be KABI. And the printk index helps user space tools to deal with this.”…””}”(hj*hj(hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KQhj hžhubeh}”(h]”Œprintk-is-not-a-stable-kabi”ah ]”h"]”Œprintk() is not a stable kabi”ah$]”h&]”uh1h´hh¶hžhhŸh³h KKubhµ)”}”(hhh]”(hº)”}”(hŒ"Subsystem specific printk wrappers”h]”hŒ"Subsystem specific printk wrappers”…””}”(hjChjAhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj>hžhhŸh³h KVubhÊ)”}”(hX)The printk index is generated using extra metadata that are stored in a dedicated .elf section ".printk_index". It is achieved using macro wrappers doing __printk_index_emit() together with the real printk() call. The same technique is used also for the metadata used by the dynamic debug feature.”h]”hX-The printk index is generated using extra metadata that are stored in a dedicated .elf section “.printk_indexâ€. It is achieved using macro wrappers doing __printk_index_emit() together with the real printk() call. The same technique is used also for the metadata used by the dynamic debug feature.”…””}”(hjQhjOhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KXhj>hžhubhÊ)”}”(hŒÏThe metadata are stored for a particular message only when it is printed using these special wrappers. It is implemented for the commonly used printk() calls, including, for example, pr_warn(), or pr_once().”h]”hŒÏThe metadata are stored for a particular message only when it is printed using these special wrappers. It is implemented for the commonly used printk() calls, including, for example, pr_warn(), or pr_once().”…””}”(hj_hj]hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K^hj>hžhubhÊ)”}”(hŒÃAdditional changes are necessary for various subsystem specific wrappers that call the original printk() via a common helper function. These needs their own wrappers adding __printk_index_emit().”h]”hŒÃAdditional changes are necessary for various subsystem specific wrappers that call the original printk() via a common helper function. These needs their own wrappers adding __printk_index_emit().”…””}”(hjmhjkhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kbhj>hžhubhÊ)”}”(hŒ²Only few subsystem specific wrappers have been updated so far, for example, dev_printk(). As a result, the printk formats from some subsystems can be missing in the printk index.”h]”hŒ²Only few subsystem specific wrappers have been updated so far, for example, dev_printk(). As a result, the printk formats from some subsystems can be missing in the printk index.”…””}”(hj{hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kfhj>hžhubeh}”(h]”Œ"subsystem-specific-printk-wrappers”ah ]”h"]”Œ"subsystem specific printk wrappers”ah$]”h&]”uh1h´hh¶hžhhŸh³h KVubhµ)”}”(hhh]”(hº)”}”(hŒSubsystem specific prefix”h]”hŒSubsystem specific prefix”…””}”(hj”hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h KlubhÊ)”}”(hŒ}The macro pr_fmt() macro allows to define a prefix that is printed before the string generated by the related printk() calls.”h]”hŒ}The macro pr_fmt() macro allows to define a prefix that is printed before the string generated by the related printk() calls.”…””}”(hj¢hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KnhjhžhubhÊ)”}”(hŒGSubsystem specific wrappers usually add even more complicated prefixes.”h]”hŒGSubsystem specific wrappers usually add even more complicated prefixes.”…””}”(hj°hj®hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KqhjhžhubhÊ)”}”(hŒìThese prefixes can be stored into the printk index metadata by an optional parameter of __printk_index_emit(). The debugfs interface might then show the printk formats including these prefixes. For example, drivers/acpi/osl.c contains::”h]”hŒëThese prefixes can be stored into the printk index metadata by an optional parameter of __printk_index_emit(). The debugfs interface might then show the printk formats including these prefixes. For example, drivers/acpi/osl.c contains:”…””}”(hŒëThese prefixes can be stored into the printk index metadata by an optional parameter of __printk_index_emit(). The debugfs interface might then show the printk formats including these prefixes. For example, drivers/acpi/osl.c contains:”hj¼hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kthjhžhubj@)”}”(hŒÔ#define pr_fmt(fmt) "ACPI: OSL: " fmt static int __init acpi_no_auto_serialize_setup(char *str) { acpi_gbl_auto_serialize_methods = FALSE; pr_info("Auto-serialization disabled\n"); return 1; }”h]”hŒÔ#define pr_fmt(fmt) "ACPI: OSL: " fmt static int __init acpi_no_auto_serialize_setup(char *str) { acpi_gbl_auto_serialize_methods = FALSE; pr_info("Auto-serialization disabled\n"); return 1; }”…””}”(hhhjËubah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j?hŸh³h KyhjhžhubhÊ)”}”(hŒ2This results in the following printk index entry::”h]”hŒ1This results in the following printk index entry:”…””}”(hŒ1This results in the following printk index entry:”hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kƒhjhžhubj@)”}”(hŒ^<6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"”h]”hŒ^<6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"”…””}”(hhhjèubah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j?hŸh³h K…hjhžhubhÊ)”}”(hŒ¯It helps matching messages from the real log with printk index. Then the source file name, line number, and function name can be used to match the string with the source code.”h]”hŒ¯It helps matching messages from the real log with printk index. Then the source file name, line number, and function name can be used to match the string with the source code.”…””}”(hjøhjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K‡hjhžhubeh}”(h]”Œsubsystem-specific-prefix”ah ]”h"]”Œsubsystem specific prefix”ah$]”h&]”uh1h´hh¶hžhhŸh³h Klubeh}”(h]”Œ printk-index”ah ]”h"]”Œ printk index”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”j7Œ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Œ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”‰Œfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œ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”‰Œ embed_images”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jjjjj;j8jŒj‰j juŒ nametypes”}”(jNjNj;NjŒNj Nuh}”(jh¶jjj8j j‰j>jjuŒ 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.