Coverage for cuda/core/_utils/cuda_utils.pyx: 72.50%
200 statements
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +0000
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5import functools
6import multiprocessing
7import platform
8import warnings
9from collections.abc import Sequence
10from typing import Any, Callable, NamedTuple
12from cuda.bindings import driver as driver, nvrtc as nvrtc, runtime as runtime
14# Module-level annotations that reference `driver`, `nvrtc`, and `runtime` so
15# that stubgen-pyx keeps these imports in the generated `.pyi` (it would
16# otherwise trim them as unused). These names are not assigned, so they only
17# affect __annotations__ and have no runtime cost.
18_keep_driver_in_stub: 'driver.CUresult'
19_keep_nvrtc_in_stub: 'nvrtc.nvrtcResult'
20_keep_runtime_in_stub: 'runtime.cudaError_t'
22from cuda.bindings.nvvm import nvvmError
23from cuda.bindings.nvjitlink import nvJitLinkError
25from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, Py_buffer, PyBUF_SIMPLE
27from cuda.bindings cimport cynvrtc, cynvvm, cynvjitlink
28from cuda.core._rt cimport (
29 register_warning_category,
30 take_last_error_detail,
31)
33from cuda.core._utils.driver_cu_result_explanations import DRIVER_CU_RESULT_EXPLANATIONS
34from cuda.core._utils.runtime_cuda_error_explanations import RUNTIME_CUDA_ERROR_EXPLANATIONS
37class CUDAError(Exception):
38 """Raised when a CUDA driver or runtime call fails.
40 The message names the CUDA error and, when one is known, explains it. A
41 secondary failure observed while the error was being raised, such as a
42 failed restoration of the caller's CUDA context, is attached as a note
43 (``__notes__``). See the error handling page of the ``cuda.core``
44 documentation for the guarantees an exception provides.
45 """
48class CUDAOutOfMemoryError(CUDAError, MemoryError):
49 """Raised when a CUDA driver or runtime call fails for lack of memory.
51 ``CUDA_ERROR_OUT_OF_MEMORY`` and ``cudaErrorMemoryAllocation`` raise this
52 class. It is both a :class:`CUDAError` and a :class:`MemoryError`, so code
53 that catches :class:`MemoryError` to retry with a smaller request handles
54 ``cuda.core`` the same way as other array libraries.
56 .. versionadded:: 1.3.0
57 """
60class CUDAWarning(RuntimeWarning):
61 """Warning issued when ``cuda.core`` hits a CUDA error it cannot raise.
63 ``cuda.core`` raises exceptions for failures in ordinary calls. Some failures
64 happen where no exception can propagate: while a resource is released by the
65 garbage collector or by a CUDA callback, including the driver calls that
66 switch and restore the CUDA context around such a release. Those failures
67 are reported as this warning instead, and the affected resource may have
68 leaked.
70 Filter on this category to make such failures fatal in tests::
72 warnings.filterwarnings("error", category=cuda.core.CUDAWarning)
74 Because the report comes from a destructor, an escalated warning cannot be
75 raised into user code; it is delivered through :func:`sys.unraisablehook`
76 (which pytest surfaces as ``PytestUnraisableExceptionWarning``).
78 .. versionadded:: 1.3.0
79 """
82# Route the C++ handle layer's non-propagating reports through this category.
83register_warning_category(<PyObject*>CUDAWarning)
86class NVRTCError(CUDAError):
87 """Raised when an NVRTC call fails; the compiler log is appended when available."""
91class ComputeCapability(NamedTuple):
92 """A named tuple of (major, minor) CUDA compute capability version numbers."""
93 major: int
94 minor: int
97def cast_to_3_tuple(label: str, cfg: int | tuple[int, ...]) -> tuple[int, int, int]:
98 cfg_orig = cfg 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-i.idi!IOf
99 if isinstance(cfg, int): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-i.idi!IOf
100 cfg = (cfg,) 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjglgngogpgqgGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0IYd1I2I3I4IUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohph5I6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthvhwhyhzh' BhChEhFhHhIhKhLhNhOhQhRhThUhWhXhe MbNf-i
101 else:
102 common = "must be an int, or a tuple with up to 3 ints" 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idi!IOf
103 if not isinstance(cfg, tuple): 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idi!IOf
104 raise ValueError(f"{label} {common} (got {type(cfg)})") 2!I
105 if len(cfg) > 3: 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idiOf
106 raise ValueError(f"{label} {common} (got tuple with length {len(cfg)})") 2.i
107 if any(not isinstance(val, int) for val in cfg): 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNfdiOf
108 raise ValueError(f"{label} {common} (got {cfg})") 2di
109 if any(val < 1 for val in cfg): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-iOf
110 plural_s = "" if len(cfg) == 1 else "s" 2Yd-iOf
111 raise ValueError(f"{label} value{plural_s} must be >= 1 (got {cfg_orig})") 2Yd-iOf
112 return cfg + (1,) * (3 - len(cfg)) 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf
115cdef int _get_current_device_id() except? -1:
116 """Return the current thread's bound CUdevice ordinal."""
117 cdef cydriver.CUdevice dev
118 with nogil:
119 HANDLE_RETURN(cydriver.cuCtxGetDevice(&dev))
120 return <int>dev
123cdef int _raise_nvrtc_error(cynvrtc.nvrtcProgram prog, cynvrtc.nvrtcResult err) except -1:
124 """Build error message with program log and raise NVRTCError."""
125 cdef const char* err_str = cynvrtc.nvrtcGetErrorString(err) 1ca
126 cdef size_t logsize = 0 1ca
127 if prog != NULL: 1ca
128 cynvrtc.nvrtcGetProgramLogSize(prog, &logsize) 1ca
129 cdef bytes log_bytes
130 cdef str log_str = "" 1ca
131 if logsize > 1 and prog != NULL: 1ca
132 log_bytes = b" " * logsize 1ca
133 if cynvrtc.nvrtcGetProgramLog(prog, <char*>log_bytes) == cynvrtc.nvrtcResult.NVRTC_SUCCESS: 1ca
134 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 1ca
135 err_msg = f"{err}: {err_str.decode()}" if err_str != NULL else f"NVRTC error {err}" 1ca
136 if log_str: 1ca
137 err_msg += f", compilation log:\n\n{log_str}" 1ca
138 raise NVRTCError(err_msg) 1ca
141cdef int _raise_nvvm_error(cynvvm.nvvmProgram prog, cynvvm.nvvmResult err) except -1:
142 """Raise nvvmError annotated with the program log."""
143 cdef size_t logsize = 0 2%b
144 if prog != NULL: 2%b
145 cynvvm.nvvmGetProgramLogSize(prog, &logsize) 2%b
146 cdef bytes log_bytes
147 cdef str log_str = "" 2%b
148 if logsize > 1 and prog != NULL: 2%b
149 log_bytes = b" " * logsize 2%b
150 if cynvvm.nvvmGetProgramLog(prog, <char*>log_bytes) == cynvvm.nvvmResult.NVVM_SUCCESS: 2%b
151 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 2%b
152 cdef object exc = nvvmError(err) 2%b
153 if log_str: 2%b
154 exc.args = (exc.args[0] + f"\nNVVM program log: {log_str}", *exc.args[1:]) 2%b
155 raise exc 2%b
158cdef int _raise_nvjitlink_error(
159 cynvjitlink.nvJitLinkHandle handle, cynvjitlink.nvJitLinkResult err) except -1:
160 """Raise nvJitLinkError annotated with the error log."""
161 cdef size_t logsize = 0 2b ]e
162 if handle != NULL: 2b ]e
163 cynvjitlink.nvJitLinkGetErrorLogSize(handle, &logsize) 1b
164 cdef bytes log_bytes
165 cdef str log_str = "" 2b ]e
166 if logsize > 1 and handle != NULL: 2b ]e
167 log_bytes = b" " * logsize 1b
168 if cynvjitlink.nvJitLinkGetErrorLog(handle, <char*>log_bytes) == \ 1b
169 cynvjitlink.nvJitLinkResult.NVJITLINK_SUCCESS: 1b
170 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 1b
171 cdef object exc = nvJitLinkError(err) 2b ]e
172 if log_str: 2b ]e
173 exc.args = (exc.args[0] + f"\nnvJitLink error log: {log_str}", *exc.args[1:]) 1b
174 raise exc 2b ]e
177_RUNTIME_SUCCESS = runtime.cudaError_t.cudaSuccess
178cdef object _RUNTIME_OUT_OF_MEMORY = runtime.cudaError_t.cudaErrorMemoryAllocation
179_NVRTC_SUCCESS = nvrtc.nvrtcResult.NVRTC_SUCCESS
182cdef inline void _attach_detail(exc, str detail):
183 # PEP 678 notes keep the detail separable from the message.
184 exc.add_note(detail) 1dAp
187cdef int _raise_driver_error(cydriver.CUresult error) except -1 nogil:
188 cdef const char* name
189 cdef const char* desc
190 # A context-scoped helper in the handle layer may have recorded why this
191 # status needs more explanation (e.g. the caller's context was not restored).
192 cdef const char* detail = take_last_error_detail(error) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
193 name_err = cydriver.cuGetErrorName(error, &name) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
194 if name_err != cydriver.CUresult.CUDA_SUCCESS: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
195 raise CUDAError(f"UNEXPECTED ERROR CODE: {error}") 2hcj
196 desc_err = cydriver.cuGetErrorString(error, &desc) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
197 with gil: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
198 exc_type = (
199 CUDAOutOfMemoryError if error == cydriver.CUresult.CUDA_ERROR_OUT_OF_MEMORY 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
200 else CUDAError 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wchcj d p s t Nb/bu Xc:b
201 )
202 # TODO: consider lower this to Cython
203 expl = DRIVER_CU_RESULT_EXPLANATIONS.get(int(error)) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
204 if expl is not None: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
205 exc = exc_type(f"{name.decode()}: {expl}") 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
206 elif desc_err != cydriver.CUresult.CUDA_SUCCESS:
207 exc = exc_type(name.decode())
208 else:
209 exc = exc_type(f"{name.decode()}: {desc.decode()}")
210 if detail != NULL: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
211 _attach_detail(exc, detail.decode()) 1dAp
212 raise exc 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b
215cdef int _raise_runtime_error(error) except -1:
216 # `_check_error()` reaches this path only for `runtime.cudaError_t` values.
217 # Use the enum name directly because Windows hybrid cudart can lag that table.
218 name = error.name 2#I$IPfj
219 exc_type = CUDAOutOfMemoryError if error == _RUNTIME_OUT_OF_MEMORY else CUDAError 2#I$IPfj
220 expl = RUNTIME_CUDA_ERROR_EXPLANATIONS.get(int(error)) 2#I$IPfj
221 if expl is not None: 2#I$IPfj
222 raise exc_type(f"{name}: {expl}") 2#I$IPfj
223 desc_err, desc = runtime.cudaGetErrorString(error) 2Pfj
224 if desc_err != _RUNTIME_SUCCESS: 2Pfj
225 raise exc_type(f"{name}")
226 desc = desc.decode() 2Pfj
227 raise exc_type(f"{name}: {desc}") 2Pfj
230cdef int _raise_nvrtc_status_error(error, handle) except -1:
231 err = f"{error}: {nvrtc.nvrtcGetErrorString(error)[1].decode()}" 2eiMK
232 if handle is not None: 2eiMK
233 _, logsize = nvrtc.nvrtcGetProgramLogSize(handle) 2ei
234 log = b" " * logsize 2ei
235 _ = nvrtc.nvrtcGetProgramLog(handle, log) 2ei
236 err += f", compilation log:\n\n{log.decode('utf-8', errors='backslashreplace')}" 2ei
237 raise NVRTCError(err) 2eiMK
240cdef inline int _check_error(error, handle=None) except?-1:
241 if isinstance(error, driver.CUresult): 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
242 return _check_driver_error(error) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLs)dMsNsOsPsQsRsSsTsUsVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*s+s,s-s.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|D}D~DaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwEe xEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
243 elif isinstance(error, runtime.cudaError_t): 2^eGiHiIiJiKi'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe
244 return _check_runtime_error(error) 2GiHiIiJiKi
245 elif isinstance(error, nvrtc.nvrtcResult): 2^e'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe
246 return _check_nvrtc_error(error, handle=handle) 2^e'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe
247 else:
248 raise RuntimeError(f"Unknown error type: {error}")
251def handle_return(result: tuple[Any, ...], handle: object = None) -> Any:
252 _check_error(result[0], handle=handle) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
253 cdef int out_len = len(result) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
254 if out_len == 1: 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
255 return 2/iD E 6dF G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 7d`eYcv k Hbicjceckclcmcncocl m n o 7 8 9 ! IbJbKbccfi# $ sc{e|e8d9dtc!d}eucvcwc#d~eafbfcfxcgihiyczcAciijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFidfefw x y ffVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$dq i %dr 'd(d3c+f,fgf-f4c5c6c7c8c9c!c#c$c%c)dhfif.fjfd kfA lfLip mf% MiNiLbXbOiPinfofpfqfQiRiSiTiUiViWiXi/v:vBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbYirfs t Zi0i1i2isftfuf3i4ivf5iwfxdxf?fyfzfB AfBf@fCfDfEf[fHce FfMbMd
256 elif out_len == 2:
257 return result[1] 2^e:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbncnk dnenfngnHbhninjnknlnmnnneconpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r.r/ri :r;r=r?r@r[r]r^r_r3c`r{r|r}rgf~rasbscsdsesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxnxoxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y)y*yyf+y,y-y.y/y:y;y=y?y@yzf[y]yAf^yBf_y`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznzozpzqzrzsztzuzvzwzxzyzzzAzBzCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+DHc,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|D}D~DaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwEe xEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5G6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI
258 else:
259 return result[1:] 2^eQfD E 6dF _eG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 7d# $ 'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLdc neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe
262cpdef object check_or_create_options(type cls, object options, str options_description="", bint keep_none=False):
263 """
264 Create the specified options dataclass from a dictionary of options or None.
265 """
266 if options is None: 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItIhgigjg.K/KPdlg:K;KQdng=K?KRdog@K[KSdpg]K^KTdqg_K`KUdGb{Krgsgtgugvg|K}K~Kwgxgygzg7d`eaLbLcLAgdLeLfLgLYc%IhLiLjLkLlLmLnLoLpLYJ'Iv k qLBg6eHb7erLsLtLicjcecuLkc(IlcmcncvLwLocCgxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvIPLQLDgEgFgRLSLGgHgIgTLJgKgLgMgNg6iOgPgUL*I(eVLWL{b|b}bXLYLZLwIxIQg0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*eccRg7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ !JBI#Jsc$J%J|e'J8d%L9d'L(J)J(L)L*L*J+L+J,Jtc-J!d.J}e/Juc,Lvc-Lwc.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J/L:L;L=L?L@L[L]Lxc^L_L`Lyc{Lzc|LAc}L~LaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMRfrMsM}JtMSfuMvMwMTfxMyMzMUfAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMdfQMRMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,M-Mw .Mx /My :M|h}h!i#i~hai$i%i=ICI?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*N+N,N-N.N/N:N'i;N=N)d?N@Nhfif.fjfd kflf[N]N]IVd^I^N_N`N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrO~JaKsOtOuObKXdcKLcvOMcwOdKxOeKyOfKmfgKhKiKzOjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iKfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Ondnfofpfqf|O}O~OaPbPcPdPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfPgPhPiPdcjP|IkP=f}IlPmPs t sftfnPoPpPqPufDI~IaJrPsPbJcJdJeJEItPfJuPvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNbvfwf[P]P^P/bDJ_P`P{P|P}P~PxdaQbQcQdQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fydwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ+d,d-dTQUQVQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRIfNdOdfcKcyRzRARBRCRshDRERFRGRthHRIRJRKRLRMRvhNRORPRQRwhRRSRTRyhURVRWRXRzhYRZR' 0R1RJJKJ2R3R4RBh5R6R7R8RCh9R!R#R$R%R'REh(R)R*R+RFh,R-R.RHh/R:R;R=RIh?R@R[RKh]R^R_R`RLh{R|R}RNh~RaSbScSOhdSeSfSQhgShSiSjSRhkSlSmSThnSoSpSqSUhrSsStSuSWhvSwSxSySXhzSASBSCSDSES;dHc=dHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueveFSGS%bHSIS:bJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJKYSZS0S1S2S3Swe4S5S6S7SKKxeLJye8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=SFf?S@S[S]S^S_S`S{S|S}S~SaTbTcTdTeTLKfTgThTiTMJjTkTlTmTnToTpTqTrTagbgcgsTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJLTMTNTOTPTQTRTSTTTUTVTWTXTGfdgYTZT0T1T2T3TMb4T5TVJegWJ6T7Tci8TMd9Tfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfggoUpUqU
267 if keep_none: 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItI.K/K:K;K=K?K@K[K]K^K_K`KGb{K|K}K~K7d`eaLbLcLdLYc%IjLkLlLmLnLoLpLYJ'Iv k 6eHb7erLsLtLicjcecuLkc(IlcmcncvLwLocxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvITL6iUL*I(eVLWL{b|b}bXLYLZLwIxI0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*e7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ BIsc$J%J|e'J8d%L9d'L(J)J(L)L*L*J+L+J,Jtc-J!d.J}e/Juc,Lvc-Lwc.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J/L:L;L=L?L@L[L]Lxc^L_L`Lyc{Lzc|LAc}L~LaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMRfrMsM}JtMSfuMvMwMTfxMyMzMUfAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMdfQM-Mw x y |h}h!i#i~hai$i%i=ICI?I[I+N,N-N.N/N:N;N=N)d?N@Nhfif.fd [N]N]IVd^I_N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrOsOtOuOXdLcMcyOmfzO*d% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iLbXbgcZd0d1dz 2d3dnfofpfqf|O}O~OaPbPcPdPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfPgPhPiPjP|I}IlPsftfnPoPpPqPufDI~IaJrPsPbJcJdJeJEItPfJuPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPoJpJqJrJsJtJFIGIHIuJvJwJxJyJzJAJBJCJNbvfwf[P]P^PDJxdaQbQcQ?eEJFJGJ@e[eHJIIIJwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRfcyRzRARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR' JJKJ2R3R4R5R6R7R8R9R!R#R$R%R'R(R)R*R+R,R-R.R/R:R;R=R?R@R[R]R^R_R`R{R|R}R~RaSbScSdSeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSxSySzSASBSES=de c neFSGS%bHS:bYSZS0S3S4S5S6S7SxeLJyea Ff?S@S^S_S`S{SaTbTcTdThTMJjTmTnTpTqTrTagbgcgsTJINJKIOJPJQJRJSJTJUJLTMTNTOTPTQTSTTTUTVTWTXT0TMb4TVJWJMdfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfggoUpUqU
268 return options 2}KdLYJv k rLsLtLicjcecuLkclcmcncvLwLocZJ0J1J2J3J4J5J6J7J8J9Jl m n o 7 8 9 ! 6i7i8iC pcqcrc9iBI$J%J'J8d9d(J)J(L*J+J,J-J!d.J/Jucvcwc#d:J;J=J?J@J[J]J^J_J`J{J|J/L;LxcyczcAcmMoMpMRfsM}JSfvMTfyMUfBMDMFMHMJMLMNMPMQM-M[I;N=N)dhf.fXdLcMc(iBK)i*i1dz 2d3dcPdPgPhPiPjP}IlPufDI~IaJrPsPbJcJdJeJEItPfJuPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPoJpJqJFIGIHIxJyJzJAJBJCJ[P]P^PII4dNcOcyRCRJRMRTR' 4R'R.R[R}RfSmSuSe FfpTqTrTagbgcgsTJIKILTMTNTOTPTQTSTTTUTVTWTXT0TMbVJWJfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfoUpUqU
269 return cls() 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItI.K/K:K;K=K?K@K[K]K^K_K`KGb{K|K~K7d`eaLbLcLYc%IjLkLlLmLnLoLpLYJ'Iv k 6eHb7eicjceckc(IlcmcncocxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvITL6iUL*I(eVLWL{b|b}bXLYLZLwIxI0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*e7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ sc$J%J|e'J8d%L9d'L(J)J)L*L*J+L+J,Jtc-J!d.J}e/J,L-L.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J:L=L?L@L[L]L^L_L`L{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlMnMqMrM}JtMuMwMxMzMAMCMEMGMIMKMMMOMdfw x y |h}h!i#i~hai$i%i=ICI?I+N,N-N.N/N:N)d?N@Nifd [N]N]IVd^I_N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrOsOtOuOXdLcMcyOmfzO*d% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iLbXbgcZd0d1dz 2d3dnfofpfqf|O}O~OaPbPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfP|IsftfnPoPpPqPDIEIrJsJtJFIGIHIuJvJwJNbvfwfDJxdaQbQcQ?eEJFJGJ@e[eHJIIIJwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRfczRARBRDRERFRGRHRIRKRLRNRORPRQRRRSRURVRWRXRYRZR' JJKJ2R3R5R6R7R8R9R!R#R$R%R(R)R*R+R,R-R/R:R;R=R?R@R]R^R_R`R{R|R~RaSbScSdSeSgShSiSjSkSlSnSoSpSqSrSsStSvSwSxSySzSASBSES=de c neFSGS%bHS:bYSZS0S3S4S5S6S7SxeLJyea ?S@S^S_S`S{SaTbTcTdThTMJjTmTnTJINJKIOJPJQJRJSJTJUJMb4TMdHfgg
270 elif isinstance(options, cls): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgPdlgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgeLfLgLYc%IhLiL'Iv k qLBg6eHb7e(ICg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e)I'e^b_b`bPLQLDgEgFgRLSLGgHgIgJgKgLgMgNgOgPg*I(e{b|b}bQg+I)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ !JBI#JRMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,Mw .Mx /My :M|h}h!i#i~hai$i%i=ICI?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*N'ijfkflf]IVd^I^N`NWd_I`I{I=e~JaKbKXdcKLcvOMcwOdKxOeKfKgKhKiKjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% KfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Onddc|IkP=f}ImPs t DI~IaJbJcJdJeJEIfJvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJhJiJjJkJlJmJnJTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNb/bDJ_P`P{P|P}P~PxddQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fyd4d+d,d-dTQUQVQNcOcIfNdOdfcKcshthvhwhyhzh' 0R1RJJKJBhChEhFhHhIhKhLhNhOhQhRhThUhWhXhCSDS;dHcHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde oepeqereseteueveISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJK1S2SweKKLJ8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=S[S]S|S}S~SeTLKfTgTiTMJkTlToTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJRTGfdgYTZT1T2T3TMb5TVJegWJ6T7Tci8TMd9T
271 return options 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgPdlgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgeLfLgLYc%IhLiL'Iv k qLBg6eHb7e(ICg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e)I'e^b_b`bPLQLDgEgFgRLSLGgHgIgJgKgLgMgNgOgPg*I(e{b|b}bQg+I)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ RMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,Mw .Mx /My :M!i#i$i%i=I?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*Njfkflf]IVd^I^N`NWd_I`I{I=e~JaKbKXdcKLcvOMcwOdKxOeKfKgKhKiKjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% KfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Onddc|IkP=f}ImPs t DI~IaJbJcJdJeJEIfJvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJhJiJjJkJlJmJnJTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNb/bDJ_P`P{P|P}P~PxddQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fyd4d+d,d-dTQUQVQNcOcIfNdOdfcKcshthvhwhyhzh' 0R1RJJKJBhChEhFhHhIhKhLhNhOhQhRhThUhWhXhCSDS;dHcHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde oepeqereseteueveISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJK1S2SweKKLJ8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=S[S]S|S}S~SeTfTgTiTMJkTlToTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJRTGfdgYTZT1T2T3TMb5TVJegWJ6T7Tci8TMd9T
272 elif isinstance(options, dict): 2!JBI#J|h}h~haiCI'ibiLKci
273 return cls(**options) 2!JBI#J|h}h~haiCILK
274 else:
275 raise TypeError( 2'ibici
276 f"The {options_description} must be provided as an object " 2'ibici
277 f"of type {cls.__name__} or as a dict with valid {options_description}. " 2'ibici
278 f"The provided object is '{options}'." 2'ibici
279 )
282def _handle_boolean_option(option: bool) -> str:
283 """
284 Convert a boolean option to a string representation.
285 """
286 return "true" if bool(option) else "false" 2'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldGKmdndydNcOczdAdBdDdHdIdJdKdLde aV
289def precondition(checker: Callable[..., None], str what="") -> Callable[..., Any]:
290 """
291 A decorator that adds checks to ensure any preconditions are met.
293 Args:
294 checker: The function to call to check whether the preconditions are met. It has
295 the same signature as the wrapped function with the addition of the keyword argument `what`.
296 what: A string that is passed in to `checker` to provide context information.
298 Returns:
299 Callable: A decorator that creates the wrapping.
300 """
302 def outer(wrapped_function: Callable) -> Callable: 2+i
303 """
304 A decorator that actually wraps the function for checking preconditions.
305 """
307 @functools.wraps(wrapped_function) 2+i
308 def inner(*args, **kwargs) -> Any:
309 """
310 Check preconditions and if they are met, call the wrapped function.
311 """
312 checker(*args, **kwargs, what=what) 2+i
313 result = wrapped_function(*args, **kwargs) 2+i
315 return result 2+i
317 return inner 2+i
319 return outer 2+i
322def is_sequence(obj: object) -> bool:
323 """
324 Check if the given object is a sequence (list or tuple).
325 """
326 return isinstance(obj, Sequence) 2Gbw x y VdWd~JaKbKcKLcMcdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzKAK% KfCKDKEKFKHKIcJcCdEdFdGdbVcVdVeVfVgVe IKJKhViVjVXUYUZUKK_f`f{f|f}f~fkVlVmVnVGf
329def is_nested_sequence(obj: object) -> bool:
330 """
331 Check if the given object is a nested sequence (list or tuple with atleast one list or tuple element).
332 """
333 return is_sequence(obj) and any(is_sequence(elem) for elem in obj) 2IcJcXUYUZU
336# Track whether we've already warned about fork method
337_fork_warning_checked = False
340def reset_fork_warning() -> None:
341 """Reset the fork warning check flag for testing purposes.
343 This function is intended for use in tests to allow multiple test runs
344 to check the warning behavior.
345 """
346 global _fork_warning_checked
347 _fork_warning_checked = False 2IfNdOdfcJfKc
350cdef inline tuple _read_fill_ptr(const char* ptr, Py_ssize_t width):
351 """Extract (value, element_size) from a raw pointer of known width."""
352 cdef unsigned int val
353 if width == 1: 2LIMINIOIPIQIRISITIUIVIWIXJ6 ;bYbZb0b=b1b2b( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb?b3b4b5b@b6b7b{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTb[b8b9b!b]b#b$bobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb
354 val = (<uint8_t*>ptr)[0] 2Yb) * + = ? 3b| } ~ gbhb8bpbqbrbybzb
355 elif width == 2:
356 val = (<uint16_t*>ptr)[0] 2LINIPIRITIVIZb0b, - . @ [ ] 4b5babbbcbibjbkb9b!bsbtbubAbBbCb
357 elif width == 4:
358 val = (<uint32_t*>ptr)[0] 2MIOIQISIUIWI6 1b2b( / : ; ^ _ ` 6b7b{ dbebfblbmbnb#b$bobvbwbxbDbEbFb
359 else:
360 raise ValueError(f"value must be 1, 2, or 4 bytes, got {width}") 2XJ;b=bObPbQb?b@bRbSbTb[b]bUbVbWb
361 return (val, <unsigned int>width) 2LIMINIOIPIQIRISITIUIVIWI6 YbZb0b1b2b( ) * + , - . / : ; = ? @ [ ] ^ _ ` 3b4b5b6b7b{ | } ~ abbbcbdbebfbgbhbibjbkblbmbnb8b9b!b#b$bobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFb
364cpdef tuple _parse_fill_value(value):
365 """Parse a fill/memset value into (raw_value, element_size).
367 Parameters
368 ----------
369 value : int or buffer-protocol object
370 - int: Must be in range [0, 256). Treated as 1-byte fill.
371 - bytes or buffer-protocol: Must be 1, 2, or 4 bytes.
373 Returns
374 -------
375 tuple of (int, int)
376 (raw_value, element_size) where element_size is 1, 2, or 4.
378 Raises
379 ------
380 OverflowError
381 If int value is outside [0, 256).
382 TypeError
383 If value is not an int and does not support the buffer protocol.
384 ValueError
385 If value byte length is not 1, 2, or 4.
386 """
387 cdef uint8_t byte_val
388 cdef Py_buffer buf
390 if isinstance(value, int): 2mInIoIpIqIrIsItIrUsULIMItUuUNIOIvUwUPIQIxUyURISIzUAUTIUIBUCUVIWIXJv k icjceckclcmcncoc6 DUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbMUNUOU' PUQURUSUTUUUVUWU
391 byte_val = value 2mInIoIpIqIrIsItIrUsUtUuUvUwUxUyUzUAUBUCUv k icjceckclcmcncocDUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iCcodpdqdEcrdsdtdGcudvdwdMUNUOU' PUQURUSUTUUUVUWU
392 return (<unsigned int>byte_val, <unsigned int>1) 2mInIoIpIqIrIsItIrUsUtUuUvUwUxUyUzUAUBUCUv k icjceckclcmcncocDUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iCcEcGcMUNUOU' PUQURUSUTUUUVUWU
394 if isinstance(value, bytes): 2LIMINIOIPIQIRISITIUIVIWIXJ6 Bc;bYbZb0b=b1b2b( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7b{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb
395 return _read_fill_ptr(<const char*><bytes>value, <Py_ssize_t>len(value)) 2LIMINIOIPIQIRISITIUIVIWIXJ;bYbZb0b=b1b2b?b3b4b5b@b6b7b[b8b9b!b]b#b$b
397 if PyObject_GetBuffer(value, &buf, PyBUF_SIMPLE) != 0: 26 Bc( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFcobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb
398 raise TypeError(
399 f"value must be an int or support the buffer protocol, "
400 f"got {type(value).__name__}"
401 )
402 try: 26 ( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb
403 return _read_fill_ptr(<const char*>buf.buf, buf.len) 26 ( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb
404 finally:
405 PyBuffer_Release(&buf)
408def check_multiprocessing_start_method() -> None:
409 """Check if multiprocessing start method is 'fork' and warn if so."""
410 global _fork_warning_checked
411 if _fork_warning_checked: 20U1U,I-I2U3U4U5U6U7U.I/I:I;Iw x y |h}h!i#i~hai$i%i8U9U!U#U$U%U'U(U)U*U+U,i,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$d%d@I'd(d3c4c5c6c7c8c9c!c#c$c%cIfNdOdfcJfKc
412 return 20U1U,I-I2U3U4U5U6U7U.I/I:I;Iw x y |h}h!i#i~hai$i%i8U9U!U#U$U%U'U(U)U*U+U,i,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$d%d@I'd(d3c4c5c6c7c8c9c!c#c$c%cKc
413 _fork_warning_checked = True 2,iIfNdOdfcJfKc
415 # Common warning message parts
416 common_message = (
417 "CUDA does not support. Forked subprocesses exhibit undefined behavior, " 2,iIfNdOdfcJfKc
418 "including failure to initialize CUDA contexts and devices. Set the start method "
419 "to 'spawn' before creating processes that use CUDA. "
420 "Use: multiprocessing.set_start_method('spawn')"
421 )
423 try: 2,iIfNdOdfcJfKc
424 start_method = multiprocessing.get_start_method() 2,iIfNdOdfcJfKc
425 if start_method == "fork": 2,iIfNdOdfcKc
426 message = f"multiprocessing start method is 'fork', which {common_message}" 2NdOdfcKc
427 warnings.warn(message, UserWarning, stacklevel=3) 2NdOdfcKc
428 except RuntimeError: 2Jf
429 # get_start_method() can raise RuntimeError if start method hasn't been set
430 # In this case, default is 'fork' on Linux, so we should warn
431 if platform.system() == "Linux": 2Jf
432 message = (
433 f"multiprocessing start method is not set and defaults to 'fork' on Linux, " 2Jf
434 f"which {common_message}"
435 )
436 warnings.warn(message, UserWarning, stacklevel=3) 2Jf