~sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget./translations/zh_CN/wmi/devices/uniwill-laptopmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/wmi/devices/uniwill-laptopmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/wmi/devices/uniwill-laptopmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/wmi/devices/uniwill-laptopmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/wmi/devices/uniwill-laptopmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/wmi/devices/uniwill-laptopmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h)SPDX-License-Identifier: GPL-2.0-or-laterh]h)SPDX-License-Identifier: GPL-2.0-or-later}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhH/var/lib/git/docbuild/linux/Documentation/wmi/devices/uniwill-laptop.rsthKubhsection)}(hhh](htitle)}(h(Uniwill Notebook driver (uniwill-laptop)h]h(Uniwill Notebook driver (uniwill-laptop)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXMany notebooks manufactured by Uniwill (either directly or as ODM) provide a EC interface for controlling various platform settings like sensors and fan control. This interface is used by the ``uniwill-laptop`` driver to map those features onto standard kernel interfaces.h](hMany notebooks manufactured by Uniwill (either directly or as ODM) provide a EC interface for controlling various platform settings like sensors and fan control. This interface is used by the }(hhhhhNhNubhliteral)}(h``uniwill-laptop``h]huniwill-laptop}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh> driver to map those features onto standard kernel interfaces.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hEC WMI interface descriptionh]hEC WMI interface description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe EC WMI interface description can be decoded from the embedded binary MOF (bmof) data using the `bmfdec `_ utility:h](hcThe EC WMI interface description can be decoded from the embedded binary MOF (bmof) data using the }(hjhhhNhNubh reference)}(h*`bmfdec `_h]hbmfdec}(hj!hhhNhNubah}(h]h ]h"]h$]h&]namebmfdecrefurihttps://github.com/pali/bmfdecuh1jhjubhtarget)}(h! h]h}(h]bmfdecah ]h"]bmfdecah$]h&]refurij2uh1j3 referencedKhjubh utility:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hX[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class used to operate methods on a ULong"), guid("{ABBC0F6F-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_MULong { [key, read] string InstanceName; [read] boolean Active; [WmiMethodId(1), Implemented, read, write, Description("Return the contents of a ULong")] void GetULong([out, Description("Ulong Data")] uint32 Data); [WmiMethodId(2), Implemented, read, write, Description("Set the contents of a ULong")] void SetULong([in, Description("Ulong Data")] uint32 Data); [WmiMethodId(3), Implemented, read, write, Description("Generate an event containing ULong data")] void FireULong([in, Description("WMI requires a parameter")] uint32 Hack); [WmiMethodId(4), Implemented, read, write, Description("Get and Set the contents of a ULong")] void GetSetULong([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); [WmiMethodId(5), Implemented, read, write, Description("Get and Set the contents of a ULong for Dollby button")] void GetButton([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); };h]hX[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class used to operate methods on a ULong"), guid("{ABBC0F6F-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_MULong { [key, read] string InstanceName; [read] boolean Active; [WmiMethodId(1), Implemented, read, write, Description("Return the contents of a ULong")] void GetULong([out, Description("Ulong Data")] uint32 Data); [WmiMethodId(2), Implemented, read, write, Description("Set the contents of a ULong")] void SetULong([in, Description("Ulong Data")] uint32 Data); [WmiMethodId(3), Implemented, read, write, Description("Generate an event containing ULong data")] void FireULong([in, Description("WMI requires a parameter")] uint32 Hack); [WmiMethodId(4), Implemented, read, write, Description("Get and Set the contents of a ULong")] void GetSetULong([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); [WmiMethodId(5), Implemented, read, write, Description("Get and Set the contents of a ULong for Dollby button")] void GetButton([in, Description("Ulong Data")] uint64 Data, [out, Description("Ulong Data")] uint32 Return); };}hjOsbah}(h]h ]h"]h$]h&]hhuh1jMhhhKhjhhubh)}(hMost of the WMI-related code was copied from the Windows driver samples, which unfortunately means that the WMI-GUID is not unique. This makes the WMI-GUID unusable for autoloading.h]hMost of the WMI-related code was copied from the Windows driver samples, which unfortunately means that the WMI-GUID is not unique. This makes the WMI-GUID unusable for autoloading.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjhhubh)}(hhh](h)}(hWMI method GetULong()h]hWMI method GetULong()}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhhhhhK5ubh)}(hOThis WMI method was copied from the Windows driver samples and has no function.h]hOThis WMI method was copied from the Windows driver samples and has no function.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjkhhubeh}(h]wmi-method-getulongah ]h"]wmi method getulong()ah$]h&]uh1hhjhhhhhK5ubh)}(hhh](h)}(hWMI method SetULong()h]hWMI method SetULong()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK:ubh)}(hOThis WMI method was copied from the Windows driver samples and has no function.h]hOThis WMI method was copied from the Windows driver samples and has no function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`_ could also be helpful.h](hThe EC behind the }(hj\hhhNhNubh)}(h``GetSetULong``h]h GetSetULong}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\ubh method is used by the OEM software supplied by the manufacturer. Reverse-engineering of this software is difficult since it uses an obfuscator, however some parts are not obfuscated. In this case }(hj\hhhNhNubj )}(h)`dnSpy `_h]hdnSpy}(hjvhhhNhNubah}(h]h ]h"]h$]h&]namednSpyj1https://github.com/dnSpy/dnSpyuh1jhj\ubj4)}(h! h]h}(h]dnspyah ]h"]dnspyah$]h&]refurijuh1j3jBKhj\ubh could also be helpful.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hj1hhubh)}(hRThe EC can be accessed under Windows using powershell (requires admin privileges):h]hRThe EC can be accessed under Windows using powershell (requires admin privileges):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahj1hhubjN)}(h> $obj = Get-CimInstance -Namespace root/wmi -ClassName AcpiTest_MULong | Select-Object -First 1 > Invoke-CimMethod -InputObject $obj -MethodName GetSetULong -Arguments @{Data = }h]h> $obj = Get-CimInstance -Namespace root/wmi -ClassName AcpiTest_MULong | Select-Object -First 1 > Invoke-CimMethod -InputObject $obj -MethodName GetSetULong -Arguments @{Data = }}hjsbah}(h]h ]h"]h$]h&]hhuh1jMhhhKehj1hhubeh}(h](reverse-engineering-the-ec-wmi-interfaceah ]h"](reverse-engineering the ec wmi interfaceah$]h&]uh1hhhhhhhhKXubh)}(hhh](h)}(hWMI event interface descriptionh]hWMI event interface description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKiubh)}(h[The WMI interface description can also be decoded from the embedded binary MOF (bmof) data:h]h[The WMI interface description can also be decoded from the embedded binary MOF (bmof) data:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjhhubjN)}(hXT[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class containing event generated ULong data"), guid("{ABBC0F72-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_EventULong : WmiEvent { [key, read] string InstanceName; [read] boolean Active; [WmiDataId(1), read, write, Description("ULong Data")] uint32 ULong; };h]hXT[WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Class containing event generated ULong data"), guid("{ABBC0F72-8EA1-11d1-00A0-C90629100000}")] class AcpiTest_EventULong : WmiEvent { [key, read] string InstanceName; [read] boolean Active; [WmiDataId(1), read, write, Description("ULong Data")] uint32 ULong; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jMhhhKphjhhubh)}(hMost of the WMI-related code was again copied from the Windows driver samples, causing this WMI interface to suffer from the same restrictions as the EC WMI interface described above.h]hMost of the WMI-related code was again copied from the Windows driver samples, causing this WMI interface to suffer from the same restrictions as the EC WMI interface described above.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhjhhubh)}(hhh](h)}(hWMI event datah]hWMI event data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK~ubh)}(hdThe WMI event data contains a single 32-bit value which is used to indicate various platform events.h]hdThe WMI event data contains a single 32-bit value which is used to indicate various platform events.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]wmi-event-dataah ]h"]wmi event dataah$]h&]uh1hhjhhhhhK~ubeh}(h]wmi-event-interface-descriptionah ]h"]wmi event interface descriptionah$]h&]uh1hhhhhhhhKiubh)}(hhh](h)}(h3Reverse-Engineering the Uniwill WMI event interfaceh]h3Reverse-Engineering the Uniwill WMI event interface}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhKubh)}(hThe driver logs debug messages when receiving a WMI event. Thus enabling debug messages will be useful for finding unknown event codes.h]hThe driver logs debug messages when receiving a WMI event. Thus enabling debug messages will be useful for finding unknown event codes.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj,hhubeh}(h]3reverse-engineering-the-uniwill-wmi-event-interfaceah ]h"]3reverse-engineering the uniwill wmi event interfaceah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hEC ACPI interface descriptionh]hEC ACPI interface description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShhhhhKubh)}(hXsThe ``INOU0000`` ACPI device is a virtual device used to access various hardware registers available on notebooks manufactured by Uniwill. Reading and writing those registers happens by calling ACPI control methods. The ``uniwill-laptop`` driver uses this device to communicate with the EC because the ACPI control methods are faster than the WMI methods described above.h](hThe }(hjdhhhNhNubh)}(h ``INOU0000``h]hINOU0000}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdubh ACPI device is a virtual device used to access various hardware registers available on notebooks manufactured by Uniwill. Reading and writing those registers happens by calling ACPI control methods. The }(hjdhhhNhNubh)}(h``uniwill-laptop``h]huniwill-laptop}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdubh driver uses this device to communicate with the EC because the ACPI control methods are faster than the WMI methods described above.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjShhubh)}(hXACPI control methods used for reading registers take a single ACPI integer containing the address of the register to read and return a ACPI integer containing the data inside said register. ACPI control methods used for writing registers however take two ACPI integers, with the additional ACPI integer containing the data to be written into the register. Such ACPI control methods return nothing.h]hXACPI control methods used for reading registers take a single ACPI integer containing the address of the register to read and return a ACPI integer containing the data inside said register. ACPI control methods used for writing registers however take two ACPI integers, with the additional ACPI integer containing the data to be written into the register. Such ACPI control methods return nothing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjShhubh)}(hhh](h)}(h System memoryh]h System memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXISystem memory can be accessed with a granularity of either a single byte (``MMRB`` for reading and ``MMWB`` for writing) or four bytes (``MMRD`` for reading and ``MMWD`` for writing). Those ACPI control methods are unused because they provide no benefit when compared to the native memory access functions provided by the kernel.h](hJSystem memory can be accessed with a granularity of either a single byte (}(hjhhhNhNubh)}(h``MMRB``h]hMMRB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh for reading and }(hjhhhNhNubh)}(h``MMWB``h]hMMWB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh for writing) or four bytes (}(hjhhhNhNubh)}(h``MMRD``h]hMMRD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh for reading and }(hjhhhNhNubh)}(h``MMWD``h]hMMWD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh for writing). Those ACPI control methods are unused because they provide no benefit when compared to the native memory access functions provided by the kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] system-memoryah ]h"] system memoryah$]h&]uh1hhjShhhhhKubh)}(hhh](h)}(hEC RAMh]hEC RAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXVThe internal RAM of the EC can be accessed with a granularity of a single byte using the ``ECRR`` (read) and ``ECRW`` (write) ACPI control methods, with the maximum register address being ``0xFFF``. The OEM software waits 6 ms after calling one of those ACPI control methods, likely to avoid overwhelming the EC when being connected over LPC.h](hYThe internal RAM of the EC can be accessed with a granularity of a single byte using the }(hj$hhhNhNubh)}(h``ECRR``h]hECRR}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$ubh (read) and }(hj$hhhNhNubh)}(h``ECRW``h]hECRW}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$ubhG (write) ACPI control methods, with the maximum register address being }(hj$hhhNhNubh)}(h ``0xFFF``h]h0xFFF}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$ubh. The OEM software waits 6 ms after calling one of those ACPI control methods, likely to avoid overwhelming the EC when being connected over LPC.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]ec-ramah ]h"]ec ramah$]h&]uh1hhjShhhhhKubh)}(hhh](h)}(hPCI config spaceh]hPCI config space}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKubh)}(hX'The PCI config space can be accessed with a granularity of four bytes using the ``PCRD`` (read) and ``PCWD`` (write) ACPI control methods. The exact address format is unknown, and poking random PCI devices might confuse the PCI subsystem. Because of this those ACPI control methods are not used.h](hPThe PCI config space can be accessed with a granularity of four bytes using the }(hjhhhNhNubh)}(h``PCRD``h]hPCRD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh (read) and }(hjhhhNhNubh)}(h``PCWD``h]hPCWD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh (write) ACPI control methods. The exact address format is unknown, and poking random PCI devices might confuse the PCI subsystem. Because of this those ACPI control methods are not used.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjphhubeh}(h]pci-config-spaceah ]h"]pci config spaceah$]h&]uh1hhjShhhhhKubh)}(hhh](h)}(hIO portsh]hIO ports}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXIO ports can be accessed with a granularity of four bytes using the ``IORD`` (read) and ``IOWD`` (write) ACPI control methods. Those ACPI control methods are unused because they provide no benefit when compared to the native IO port access functions provided by the kernel.h](hDIO ports can be accessed with a granularity of four bytes using the }(hjhhhNhNubh)}(h``IORD``h]hIORD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh (read) and }(hjhhhNhNubh)}(h``IOWD``h]hIOWD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh (write) ACPI control methods. Those ACPI control methods are unused because they provide no benefit when compared to the native IO port access functions provided by the kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]io-portsah ]h"]io portsah$]h&]uh1hhjShhhhhKubh)}(hhh](h)}(hCMOS RAMh]hCMOS RAM}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXThe CMOS RAM can be accessed with a granularity of a single byte using the ``RCMS`` (read) and ``WCMS`` ACPI control methods. Using those ACPI methods might interfere with the native CMOS RAM access functions provided by the kernel due to the usage of indexed IO, so they are unused.h](hKThe CMOS RAM can be accessed with a granularity of a single byte using the }(hjhhhNhNubh)}(h``RCMS``h]hRCMS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh (read) and }(hjhhhNhNubh)}(h``WCMS``h]hWCMS}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh ACPI control methods. Using those ACPI methods might interfere with the native CMOS RAM access functions provided by the kernel due to the usage of indexed IO, so they are unused.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]cmos-ramah ]h"]cmos ramah$]h&]uh1hhjShhhhhKubh)}(hhh](h)}(h Indexed IOh]h Indexed IO}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhhhhhKubh)}(hXIndexed IO with IO ports with a granularity of a single byte can be performed using the ``RIOP`` (read) and ``WIOP`` (write) ACPI control methods. Those ACPI methods are unused because they provide no benifit when compared to the native IO port access functions provided by the kernel.h](hXIndexed IO with IO ports with a granularity of a single byte can be performed using the }(hjbhhhNhNubh)}(h``RIOP``h]hRIOP}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbubh (read) and }(hjbhhhNhNubh)}(h``WIOP``h]hWIOP}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbubh (write) ACPI control methods. Those ACPI methods are unused because they provide no benifit when compared to the native IO port access functions provided by the kernel.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjQhhubh)}(hXpSpecial thanks go to github user `pobrn` which developed the `qc71_laptop `_ driver on which this driver is partly based. The same is true for Tuxedo Computers, which developed the `tuxedo-drivers `_ package which also served as a foundation for this driver.h](h!Special thanks go to github user }(hjhhhNhNubhtitle_reference)}(h`pobrn`h]hpobrn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh which developed the }(hjhhhNhNubj )}(h5`qc71_laptop `_h]h qc71_laptop}(hjhhhNhNubah}(h]h ]h"]h$]h&]name qc71_laptopj1$https://github.com/pobrn/qc71_laptopuh1jhjubj4)}(h' h]h}(h] qc71-laptopah ]h"] qc71_laptopah$]h&]refurijuh1j3jBKhjubhi driver on which this driver is partly based. The same is true for Tuxedo Computers, which developed the }(hjhhhNhNubj )}(hZ`tuxedo-drivers `_h]htuxedo-drivers}(hjhhhNhNubah}(h]h ]h"]h$]h&]nametuxedo-driversj1Fhttps://gitlab.com/tuxedocomputers/development/packages/tuxedo-driversuh1jhjubj4)}(hI h]h}(h]tuxedo-driversah ]h"]tuxedo-driversah$]h&]refurijuh1j3jBKhjubh; package which also served as a foundation for this driver.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjQhhubeh}(h] indexed-ioah ]h"] indexed ioah$]h&]uh1hhjShhhhhKubeh}(h]ec-acpi-interface-descriptionah ]h"]ec acpi interface descriptionah$]h&]uh1hhhhhhhhKubeh}(h]&uniwill-notebook-driver-uniwill-laptopah ]h"](uniwill notebook driver (uniwill-laptop)ah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj5error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jj jjj.j+j>j;jjjjjjjjj&j#jjjjj)j&j!jjPjMjjjj jmjjjjjjjNjKjjjjjju nametypes}(jjj.j>jjjjj&jjj)j!jPjjjmjjjNjjjuh}(j hjhj+jj;j5jjkjjjjjjj#jjj1jjj&jjjjMj,jjSj jjjjjjpjjjKjjjQjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.