crosshair-tool 0.0.84__cp312-cp312-win_amd64.whl → 0.0.85__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of crosshair-tool might be problematic. Click here for more details.

crosshair/util.py CHANGED
@@ -12,6 +12,7 @@ import sys
12
12
  import threading
13
13
  import traceback
14
14
  import types
15
+ from array import array
15
16
  from dataclasses import dataclass
16
17
  from enum import Enum
17
18
  from inspect import (
@@ -20,6 +21,7 @@ from inspect import (
20
21
  getmodulename,
21
22
  getsourcefile,
22
23
  getsourcelines,
24
+ isdatadescriptor,
23
25
  isfunction,
24
26
  )
25
27
  from time import monotonic
@@ -52,6 +54,19 @@ from crosshair.tracers import COMPOSITE_TRACER, NoTracing, ResumedTracing, is_tr
52
54
  _DEBUG_STREAM: Optional[TextIO] = None
53
55
 
54
56
 
57
+ if sys.version_info >= (3, 12):
58
+ from collections.abc import Buffer
59
+
60
+ def is_bytes_like(obj: object) -> bool:
61
+ return isinstance(obj, Buffer)
62
+
63
+ else:
64
+ from collections.abc import ByteString
65
+
66
+ def is_bytes_like(obj: object) -> bool:
67
+ return isinstance(obj, (ByteString, array))
68
+
69
+
55
70
  def is_iterable(o: object) -> bool:
56
71
  try:
57
72
  iter(o) # type: ignore
@@ -148,7 +163,7 @@ else:
148
163
 
149
164
 
150
165
  class IdKeyedDict(collections.abc.MutableMapping):
151
- def __init__(self):
166
+ def __init__(self) -> None:
152
167
  # Confusingly, we hold both the key object and value object in
153
168
  # our inner dict. Holding the key object ensures that we don't
154
169
  # GC the key object, which could lead to reusing the same id()
@@ -665,25 +680,39 @@ class IgnoreAttempt(ControlFlowException):
665
680
  debug("IgnoreAttempt stack:", ch_stack())
666
681
 
667
682
 
668
- ExtraUnionType = getattr(types, "UnionType") if sys.version_info >= (3, 10) else None
683
+ if (3, 10) <= sys.version_info < (3, 14):
684
+ # Specialize some definitions for the Python versions where
685
+ # typing.Union != types.UnionType:
669
686
 
687
+ def origin_of(typ: Type) -> Type:
688
+ if hasattr(typ, "__origin__"):
689
+ return typ.__origin__
690
+ elif isinstance(typ, types.UnionType):
691
+ return cast(Type, Union)
692
+ else:
693
+ return typ
670
694
 
671
- def origin_of(typ: Type) -> Type:
672
- if hasattr(typ, "__origin__"):
673
- return typ.__origin__
674
- elif ExtraUnionType and isinstance(typ, ExtraUnionType):
675
- return cast(Type, Union)
676
- else:
677
- return typ
695
+ def type_args_of(typ: Type) -> Tuple[Type, ...]:
696
+ if getattr(typ, "__args__", None):
697
+ if isinstance(typ, types.UnionType):
698
+ return typ.__args__
699
+ return typing_inspect.get_args(typ, evaluate=True)
700
+ else:
701
+ return ()
702
+
703
+ else:
678
704
 
705
+ def type_args_of(typ: Type) -> Tuple[Type, ...]:
706
+ if getattr(typ, "__args__", None):
707
+ return typing_inspect.get_args(typ, evaluate=True)
708
+ else:
709
+ return ()
679
710
 
680
- def type_args_of(typ: Type) -> Tuple[Type, ...]:
681
- if getattr(typ, "__args__", None):
682
- if ExtraUnionType and isinstance(typ, ExtraUnionType):
683
- return typ.__args__
684
- return typing_inspect.get_args(typ, evaluate=True)
685
- else:
686
- return ()
711
+ def origin_of(typ: Type) -> Type:
712
+ origin = getattr(typ, "__origin__", None)
713
+ # 3.14 unifies typing.Union and types.Union, so that's good!
714
+ # But a of 3.14.0a6, types.Union.__origin__ yields a data descriptor, so we need to check that.
715
+ return typ if origin is None or isdatadescriptor(origin) else origin
687
716
 
688
717
 
689
718
  def type_arg_of(typ: Type, index: int) -> Type:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crosshair-tool
3
- Version: 0.0.84
3
+ Version: 0.0.85
4
4
  Summary: Analyze Python code for correctness using symbolic execution.
5
5
  Home-page: https://github.com/pschanely/CrossHair
6
6
  Author: Phillip Schanely
@@ -1,42 +1,42 @@
1
- _crosshair_tracers.cp312-win_amd64.pyd,sha256=8M3ThRgMWc-Sa4WrueVLmPip2PvaXUoi9R5njRf_CAc,25600
2
- crosshair/__init__.py,sha256=b1IMsf545mm7J-blZ17q5pZMBSdgs_7DwkOOUxyunQ8,978
1
+ _crosshair_tracers.cp312-win_amd64.pyd,sha256=6OdujE4ERas0WIvDLdWds119x2xHCz5T5FH7gdcR4M8,25600
2
+ crosshair/__init__.py,sha256=HTc3Ezw8DRe6aQCzqPaxWHKu8y2T_g6mPqpaw8SqYEY,978
3
3
  crosshair/__main__.py,sha256=i4pjsZlXvtieQHJTEB0sF3e40qJjLoOm1z5rm-u70Uo,260
4
- crosshair/_mark_stacks.h,sha256=XylvLzFaX8a2UzEkWPh3L9MZoyDh0yvZ6Y0Rgsegh_Y,30676
4
+ crosshair/_mark_stacks.h,sha256=R5ZwGlth2DCk6l11hWICPcwSadvtM2VcLf5Zo_pHYa4,30068
5
5
  crosshair/_preliminaries_test.py,sha256=klkzKGpyyVDGctCXdvq1xyXbGa4PRnXda1jfgE-7LLY,522
6
- crosshair/_tracers.h,sha256=39yWCs3BXPX-K5khVnO8QveTU-eDCvskiTNVrO8Pnyg,2161
6
+ crosshair/_tracers.h,sha256=IJNUQ01LQurzap8qCgqLcOhkRpeY1BIRKrVj-OUlIj8,2217
7
7
  crosshair/_tracers_pycompat.h,sha256=KqJHbya8zi1Z4Qrk2S6P-FfmC_Ew5LYvTxbA-V9TWPw,14878
8
- crosshair/_tracers_test.py,sha256=wi7ONnBywdI8sslzsncz6nMWlVpOdcH8bVztk32xJwM,3620
8
+ crosshair/_tracers_test.py,sha256=l0WYk74xtr5tlT9ID0kq11jUmw_Ai-hevNX7eZHg4RY,3734
9
9
  crosshair/abcstring.py,sha256=Jvnnm7xsHGTcZvu5mbV_eL5IVEvbNNbeCauM6f7QYEI,6794
10
10
  crosshair/auditwall.py,sha256=Rlz0PDjAK17ykpcqbh8tstN4MXk3w09J-E1ibIKUv7o,5162
11
11
  crosshair/auditwall_test.py,sha256=SKTy_7Q6xP0Den4i7HRHSaU0b37smi_Mb-arQnppFPI,2107
12
12
  crosshair/codeconfig.py,sha256=L0EmcEZlWA51sl32uBxvFPwbTmuglVDHNq8k35JkXw0,4071
13
13
  crosshair/codeconfig_test.py,sha256=n5kXtW60vG_CA0QlzLE3mS4k9caEwhB30bnhaGNh6Ww,3467
14
- crosshair/condition_parser.py,sha256=M_hfJ7Qz_ocCLOyGxTl_lTvHaF-ZDs9PV84W44L43AE,43799
15
- crosshair/condition_parser_test.py,sha256=_mAkkjjhoEpMOQhhaEqSLSFFhxdAwQP1xYTnaormoUU,16031
14
+ crosshair/condition_parser.py,sha256=EBlBI2u-69etsqCpMJ2arHDRhC26zpcX25tHSIZylj0,43883
15
+ crosshair/condition_parser_test.py,sha256=kosW60A4HnBBT3sOHxWCl_cixpbO1kmsjgNuNUgHCDE,16031
16
16
  crosshair/conftest.py,sha256=JjUauvXnjERszuS46iskuBRHBx-0uHacwKHeQ-gEQ2c,683
17
- crosshair/copyext.py,sha256=U4C24YF_jZf9yRduZGLLP6qXIRFbPiBHIyywu2liyzw,4708
18
- crosshair/copyext_test.py,sha256=kYbidguhGQBRvNY163IT8EkDJNg1TNOhIW0VwHXPUGA,1903
17
+ crosshair/copyext.py,sha256=_SRnS6UrUFl2-CHl8uRIOq-Y0MKYNQTFK132S3Ru34A,5044
18
+ crosshair/copyext_test.py,sha256=VSIoVeqAf18g2RNuLTbyNWJiMBgzHeab7LNX1KHCWZU,2182
19
19
  crosshair/core.py,sha256=uVUz_SUye6EeV9EKGSnBFfK9G0MaZ2kLCjFUqorGR_c,65380
20
20
  crosshair/core_and_libs.py,sha256=U9GDCBE9Ecxy7T7bmJT7IYiQTdY1C8qbcoIoMMocu5U,4112
21
21
  crosshair/core_regestered_types_test.py,sha256=3o1GrtjCEWSW-paPp5-yVdE2K1_ZIviGCff7KVZ0VS0,2181
22
22
  crosshair/core_test.py,sha256=bHpq_OcUsVWFWGnsCUX4AEM22vLfoCzCsPaEnsbAzYc,33490
23
23
  crosshair/diff_behavior.py,sha256=2T11J2Hk35Qp3RRp5ALtXyTgAl3v0W3KDNR_mSec-D4,11567
24
24
  crosshair/diff_behavior_test.py,sha256=TUmqPOj_Qij8a7NMLFYt0IskL5Q_CdDLD5pnxnomuJ0,7505
25
- crosshair/dynamic_typing.py,sha256=9cIUZqB7A8bvu8u-fgX0nc5grtnjFQLrsZYP2y53keI,12307
25
+ crosshair/dynamic_typing.py,sha256=YDh0e73AnWyPjwjPXbjO4vSqpgIhYaV5AURpRe2AkXg,12323
26
26
  crosshair/dynamic_typing_test.py,sha256=szfUa9zLFVMv1YiuJvrC9-ZMZnlS36tqJ373MGXVkAA,5673
27
27
  crosshair/enforce.py,sha256=lIeDeqavEa06tVMlIk5ScibVGS04yHZ3xIpkTPK5QQw,10291
28
28
  crosshair/enforce_test.py,sha256=CvofUxa_Y-np5vhlBcjsrZ2CkpxNFbjv5U-rH027pw4,4847
29
29
  crosshair/fnutil.py,sha256=Fe77jLudjf7X_fNLExLoMTFElQWQ3wCpA_MC06JaOKk,13515
30
- crosshair/fnutil_test.py,sha256=1BFFpVnCMM-rS9k_JdSSjX1pPXRpEkUKlmG5e_rFZ1I,2166
30
+ crosshair/fnutil_test.py,sha256=I-jFcROrNFUs7xSGrLcGJk_cX8014g5h8ItwPSFpvLY,2264
31
31
  crosshair/fuzz_core_test.py,sha256=wWILaE5cpxfiRl89WgCWMpNIGS8BnWcQmgartQYCCJ8,17411
32
- crosshair/lsp_server.py,sha256=lOj-Nd-ouQ3AFTWw1agoj8MzZ8324ac_NopGimCy_S0,8920
32
+ crosshair/lsp_server.py,sha256=Kl6z-Nudt2ZkzV0ojfzvGGa3cukXLOYKTCHYJUxzrRk,8920
33
33
  crosshair/lsp_server_test.py,sha256=yHp7JtJLpF2G049lwhNlgAYXnVM88CtsudVVHVY7Hs0,999
34
34
  crosshair/main.py,sha256=Dibj8nGZeNe010vCU0j1v-h8IhcUJyyED_dVKQZaIj0,35341
35
35
  crosshair/main_test.py,sha256=YDnAaAm6A8g-3D5qVTQJ69wnBEx7Ag33AlJmrf-pifk,14917
36
36
  crosshair/objectproxy.py,sha256=qYPVvH3EVUmh7GI9-73mfmOTzcTH_gyn5DhK44hp8KI,9286
37
37
  crosshair/objectproxy_test.py,sha256=P5N28U5l9ngozqLr2EgtVOII3PS3fB2dOOPc9LLt8Zo,590
38
- crosshair/opcode_intercept.py,sha256=oHbA0EivugRKIhRRLN_9TWvVWIbbV78UojVf3Or_Kto,18798
39
- crosshair/opcode_intercept_test.py,sha256=89VEwB-2L9PRIMZjVL90lcgV9h52w2br88V4mSbuWsA,5930
38
+ crosshair/opcode_intercept.py,sha256=Nbs2c1i9J720pz7RogOyC-vPabh9b3cybUtriikwfG0,19500
39
+ crosshair/opcode_intercept_test.py,sha256=31-3gNmRWmRfXY0KdlvUo1MGPtoLerHLGzFIGTDQ88I,6397
40
40
  crosshair/options.py,sha256=y3lYP5AfwkHFXjF7zl0kUrTH1_C5u1DMo_yAH_mivm8,6993
41
41
  crosshair/options_test.py,sha256=eTlaTqNb29I3ZyyV0yCq_kEeE441l4xh-jKF_W6cWqs,389
42
42
  crosshair/patch_equivalence_test.py,sha256=JsJkKSjjyXynTAnZBGIJsFN_vyoiZfNTeiq5FjRVXIE,2579
@@ -60,12 +60,12 @@ crosshair/stubs_parser.py,sha256=tJwChs8--UZjCtkshijzA-1K2tiZ2-mgpea_hJIdVJI,145
60
60
  crosshair/stubs_parser_test.py,sha256=eUIy8E7LoR7tmUy3dkZEOQqDWFq7hoqbIBdJ_nwkeIE,1271
61
61
  crosshair/test_util.py,sha256=O2Uqvv4deGh_OEX3npy3WnceP89kH1lo1ySl3UYKrwE,10378
62
62
  crosshair/test_util_test.py,sha256=0A82V5O1bvg-cbc7GsaeWM6lzVSKF45cQRNJU9v1fzQ,528
63
- crosshair/tracers.py,sha256=Ytd6ist-3fXBcYlwhfbrIR3dEXaH_6y7-I13GUBadkk,16957
63
+ crosshair/tracers.py,sha256=kMUixlsd5zMjfXt_eNn7HS86yIu6c5tP45Cold76yWs,17662
64
64
  crosshair/tracers_test.py,sha256=73lIgNCVf4QhJo5uzoonH55vKWoYDffeYb8AdCZEQHw,3424
65
- crosshair/type_repo.py,sha256=OwMEcUZEYxnP9Pxrv4kbUBBFnInxDJcjnKR0L1zgOII,4766
66
- crosshair/unicode_categories.py,sha256=qcTLV1lJ0skY9sRo7YlEtRvfJCvGda-nWcImoB4RZX4,286514
65
+ crosshair/type_repo.py,sha256=TTgWOb-8yzTKn4ptZQWWGAot6tJn9T92r0DHGjhs5N4,4800
66
+ crosshair/unicode_categories.py,sha256=JWGv47BSq1Cj-uYSWBQ4kYlsIPlmcPvaUxO6YG8d9I0,334108
67
67
  crosshair/unicode_categories_test.py,sha256=KZ2OKOSMALmFp1BQbWj1-x6Ek5Iv2byxF4ytx2mN7LU,766
68
- crosshair/util.py,sha256=TKx8t2cyKWQtx35PocWgk8VT6cwt5toHu-bShMrYdfo,21703
68
+ crosshair/util.py,sha256=oziPlZyeh_vIeaq3HmBvy_S-saOHaIrUJ8km7ecPPX4,22709
69
69
  crosshair/util_test.py,sha256=fIc3TeMbyu9nI430_gGbUrqXhPJ5wl9TxWAtIGgEL4s,4849
70
70
  crosshair/watcher.py,sha256=A8ywSNPUY6Y4BHVO51dGM18nQcwGYx_kbBEwIOMTzF4,10355
71
71
  crosshair/watcher_test.py,sha256=TCOdXmdGZ3NJ59X_w7SRVqiJY-BL2tUqyXK-3ql1d6s,2871
@@ -95,19 +95,19 @@ crosshair/examples/icontract/correct_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-
95
95
  crosshair/examples/icontract/correct_code/arith.py,sha256=fImqdDCzE523ijM5TZnFJMGpq7otdLoNoM3uu66vUus,1559
96
96
  crosshair/examples/icontract/correct_code/showcase.py,sha256=UlVhUWU1KKf285tL41DP_z-Uywid4kh1U2kUwje5mZ8,3181
97
97
  crosshair/libimpl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
- crosshair/libimpl/arraylib.py,sha256=fGhA_WGR7V-DR1EuBHpwlbtqVtk5g9-t32N1ePOSczA,5355
98
+ crosshair/libimpl/arraylib.py,sha256=Wo6XSvJz3SgSmfpyvrdlCNJHlDhFxQCBqUTX3Q0LCpI,5038
99
99
  crosshair/libimpl/binascii_ch_test.py,sha256=qWAYU1Sid3muwYL8pvVoCsMQtm5t3J8jFtolygvdghQ,1039
100
100
  crosshair/libimpl/binascii_test.py,sha256=Yg37_B-eywcLq7EbsJZR3BUYYF6A1PGxE4qsmeBMyXg,2037
101
101
  crosshair/libimpl/binasciilib.py,sha256=kBFH5-W_q1gCTC-wusSq0cAsUsB_xOUpcW0XQbLzkSQ,5220
102
102
  crosshair/libimpl/bisectlib_test.py,sha256=rVpcalZ4g3xr_b6z1Bv2FU1N07vPZyWhU9_CPzC8sBk,776
103
- crosshair/libimpl/builtinslib.py,sha256=4RZ9o8PJPgS_vtT6vZvXZxOucTrDNL6ibOXKWGRfji0,187645
103
+ crosshair/libimpl/builtinslib.py,sha256=0IiNwSCFlt4KHoOJIkAPiti9huaP6gyt9hu1yrXe_L0,187858
104
104
  crosshair/libimpl/builtinslib_ch_test.py,sha256=Do8kWNgfosLfI3yzZvTZ3ceuKTF0axN1ckkNZyn4ozE,31685
105
105
  crosshair/libimpl/builtinslib_test.py,sha256=-TYk-ctn0YxT6I4ZFeSmRF-zB857KAWNaaJs9lwVzhs,93928
106
106
  crosshair/libimpl/codecslib.py,sha256=cvpCbieFRB4BdfLqmKeJzpvm35qZ0ONqtilXPmN8OWI,2754
107
107
  crosshair/libimpl/codecslib_test.py,sha256=3_uqcxEYK3BONdga0skZ1BkSPkIHRCgdoMB8NM3oUVY,2622
108
- crosshair/libimpl/collectionslib.py,sha256=LAnOG7ivHu_gq8KMOPirzjjn_Ua9R2IuxDmJDiXbe4I,8530
108
+ crosshair/libimpl/collectionslib.py,sha256=ltywQks-W56CkxvUawvcGZwsBcm6t2u5JLbA56nzqPs,8847
109
109
  crosshair/libimpl/collectionslib_ch_test.py,sha256=A6-qeCU1zTcvuS6HkmF48Q45F3SvQJkh-BTUc2DKxJo,6107
110
- crosshair/libimpl/collectionslib_test.py,sha256=ttl88lydCERlS9lbzuNjmQdxIHe2VSW9Zz9SFebglD4,9156
110
+ crosshair/libimpl/collectionslib_test.py,sha256=Wm67Bw1Lg6ts5DF2ii98SUr4f8YZa0zzK0IiwhdFExg,9496
111
111
  crosshair/libimpl/copylib.py,sha256=s2q6jMCT2bvzyq5kQyT40TsmOeeJmLI4Corz4qWDZyE,550
112
112
  crosshair/libimpl/datetimelib.py,sha256=fN-w40BapjLSOiGYpjBsJOvui14_VQvdwx-wKHKoDOU,81411
113
113
  crosshair/libimpl/datetimelib_ch_test.py,sha256=NpZjUJgM08gB04d2gXkbrm7Y7Pdh3aso9GYb9iZtq6o,9632
@@ -145,8 +145,8 @@ crosshair/libimpl/randomlib_test.py,sha256=szLn-O2No5JN83AE6UC5p9rm27nLKTpttXsV_
145
145
  crosshair/libimpl/relib.py,sha256=oqAKNC_RiXbH5cRwVBRhG1UAaqQLclt3_UAFDt6UzhY,30102
146
146
  crosshair/libimpl/relib_ch_test.py,sha256=o-u9iHMcw3QIl99fP42BkrWtoC0rfv8C72OsiuO55nM,5404
147
147
  crosshair/libimpl/relib_test.py,sha256=f-xqNpOZKbp6kg0VyrkXANt0gglF2ykwAeG8uGQHSuI,16578
148
- crosshair/libimpl/timelib.py,sha256=S2zNnQ5SoRepuAdeh8CzTqlz0zTJdCa_xHf36OUwBHA,1864
149
- crosshair/libimpl/timelib_test.py,sha256=CA5-aK6twd9BEvxaFvUr3wE6uIQx6Dd_1YgIF5rk3jc,1703
148
+ crosshair/libimpl/timelib.py,sha256=mP7hYp2ULlUU8eb5Z2nlrKMMgnBwqIuUX8gLG1q2hO4,2481
149
+ crosshair/libimpl/timelib_test.py,sha256=LP1jJh9EvbG58Zc7JjDj0yiYPXOXOtt549sV1bfJoME,1933
150
150
  crosshair/libimpl/typeslib.py,sha256=PKkmXx_fyseiP3gNvQ5BIg6psHHCcW_blVPUSuMNzLs,483
151
151
  crosshair/libimpl/typeslib_test.py,sha256=PTYWOs04ogJ4T7PiRAss2sxQgydduJkc8YtM8LNtj84,1118
152
152
  crosshair/libimpl/unicodedatalib.py,sha256=WoDGPGs2bpoiO0pnnnBOBmHfxVgzOF4XjehqImn7Pt4,3178
@@ -166,9 +166,9 @@ crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
166
  crosshair/tools/check_help_in_doc.py,sha256=An-2EJ0_Xr-Szo431AoEgJafoFWwnPl8HoT4bi86dd8,8499
167
167
  crosshair/tools/check_init_and_setup_coincide.py,sha256=f4TvPg1Q3C_BQYtGgPfY_fqxo_ZTeU7QCy7WwQjaIlA,3621
168
168
  crosshair/tools/generate_demo_table.py,sha256=qm4ZUXjUBKkVZ3bVVK9h6dJMDKYme8zMl-7at_aG7b0,3958
169
- crosshair_tool-0.0.84.dist-info/licenses/LICENSE,sha256=qQLSJN48eqvalILMr3uzkg0p74FtK7WSwkux-0twy-s,4552
170
- crosshair_tool-0.0.84.dist-info/METADATA,sha256=OyH44EZGpeyJNQYme3fwJdDW1SSHodXmsXkrycM4hUk,6862
171
- crosshair_tool-0.0.84.dist-info/WHEEL,sha256=bD_lVjJPXnAmh08wyNd_NU-OTjIi9_WBp6WVHPsPU2g,101
172
- crosshair_tool-0.0.84.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
173
- crosshair_tool-0.0.84.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
174
- crosshair_tool-0.0.84.dist-info/RECORD,,
169
+ crosshair_tool-0.0.85.dist-info/licenses/LICENSE,sha256=qQLSJN48eqvalILMr3uzkg0p74FtK7WSwkux-0twy-s,4552
170
+ crosshair_tool-0.0.85.dist-info/METADATA,sha256=8gusoMxL2F5xNvF4ZKPdl-QgStHc9gdEOg3JLI0GuA0,6862
171
+ crosshair_tool-0.0.85.dist-info/WHEEL,sha256=ovhA9_Ei_7ok2fAych90j-feDV4goiAxbO7REePtvw0,101
172
+ crosshair_tool-0.0.85.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
173
+ crosshair_tool-0.0.85.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
174
+ crosshair_tool-0.0.85.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (77.0.3)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-win_amd64
5
5