oscura 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.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.
@@ -0,0 +1,156 @@
1
+ """Figure management for saving and organizing matplotlib figures.
2
+
3
+ This module provides utilities for saving matplotlib figures in multiple formats
4
+ and managing collections of figures for report generation.
5
+
6
+ Example:
7
+ >>> from oscura.visualization.figure_manager import FigureManager
8
+ >>> manager = FigureManager(output_dir="./plots")
9
+ >>> paths = manager.save_figure(fig, "timing_diagram", formats=["png", "svg"])
10
+ >>> base64_img = manager.embed_as_base64(fig, format="png")
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import base64
16
+ from io import BytesIO
17
+ from pathlib import Path
18
+ from typing import TYPE_CHECKING, Any
19
+
20
+ if TYPE_CHECKING:
21
+ from matplotlib.figure import Figure
22
+
23
+
24
+ class FigureManager:
25
+ """Manager for saving and organizing matplotlib figures.
26
+
27
+ Attributes:
28
+ output_dir: Directory for saving figures.
29
+ saved_figures: Dictionary mapping figure names to saved paths.
30
+ """
31
+
32
+ def __init__(self, output_dir: str | Path):
33
+ """Initialize figure manager.
34
+
35
+ Args:
36
+ output_dir: Directory for saving figures.
37
+ """
38
+ self.output_dir = Path(output_dir)
39
+ self.output_dir.mkdir(parents=True, exist_ok=True)
40
+ self.saved_figures: dict[str, dict[str, Path]] = {}
41
+
42
+ def save_figure(
43
+ self,
44
+ fig: Figure,
45
+ name: str,
46
+ *,
47
+ formats: list[str] | None = None,
48
+ dpi: int = 300,
49
+ **savefig_kwargs: Any,
50
+ ) -> dict[str, Path]:
51
+ """Save figure in multiple formats.
52
+
53
+ Args:
54
+ fig: Matplotlib figure to save.
55
+ name: Base name for the saved files (without extension).
56
+ formats: List of formats to save ("png", "svg", "pdf"). Defaults to ["png"].
57
+ dpi: Resolution for raster formats (default: 300).
58
+ **savefig_kwargs: Additional kwargs passed to fig.savefig().
59
+
60
+ Returns:
61
+ Dictionary mapping format to saved file path.
62
+
63
+ Example:
64
+ >>> paths = manager.save_figure(fig, "timing_diagram", formats=["png", "svg"])
65
+ >>> print(paths["png"]) # PosixPath('./plots/timing_diagram.png')
66
+ """
67
+ if formats is None:
68
+ formats = ["png"]
69
+
70
+ saved_paths: dict[str, Path] = {}
71
+
72
+ for fmt in formats:
73
+ # Construct file path
74
+ file_path = self.output_dir / f"{name}.{fmt}"
75
+
76
+ # Save figure
77
+ fig.savefig(
78
+ file_path,
79
+ dpi=dpi,
80
+ bbox_inches="tight",
81
+ format=fmt,
82
+ **savefig_kwargs,
83
+ )
84
+
85
+ saved_paths[fmt] = file_path
86
+
87
+ # Store in saved_figures registry
88
+ self.saved_figures[name] = saved_paths
89
+
90
+ return saved_paths
91
+
92
+ def embed_as_base64(
93
+ self,
94
+ fig: Figure,
95
+ format: str = "png",
96
+ dpi: int = 150,
97
+ **savefig_kwargs: Any,
98
+ ) -> str:
99
+ """Convert figure to base64-encoded string for HTML embedding.
100
+
101
+ Args:
102
+ fig: Matplotlib figure to convert.
103
+ format: Image format ("png", "jpg", "svg"). Default: "png".
104
+ dpi: Resolution for raster formats (default: 150).
105
+ **savefig_kwargs: Additional kwargs passed to fig.savefig().
106
+
107
+ Returns:
108
+ Base64-encoded image string (without data URI prefix).
109
+
110
+ Example:
111
+ >>> base64_img = manager.embed_as_base64(fig)
112
+ >>> html = f'<img src="data:image/png;base64,{base64_img}" />'
113
+ """
114
+ # Save figure to bytes buffer
115
+ buf = BytesIO()
116
+ fig.savefig(
117
+ buf,
118
+ format=format,
119
+ dpi=dpi,
120
+ bbox_inches="tight",
121
+ **savefig_kwargs,
122
+ )
123
+ buf.seek(0)
124
+
125
+ # Encode to base64
126
+ img_base64 = base64.b64encode(buf.read()).decode("utf-8")
127
+ buf.close()
128
+
129
+ return img_base64
130
+
131
+ def get_saved_path(self, name: str, format: str) -> Path | None:
132
+ """Get path to a saved figure.
133
+
134
+ Args:
135
+ name: Figure name.
136
+ format: Image format.
137
+
138
+ Returns:
139
+ Path to saved figure, or None if not found.
140
+ """
141
+ if name in self.saved_figures:
142
+ return self.saved_figures[name].get(format)
143
+ return None
144
+
145
+ def list_saved_figures(self) -> list[str]:
146
+ """Get list of all saved figure names.
147
+
148
+ Returns:
149
+ List of figure names.
150
+ """
151
+ return list(self.saved_figures.keys())
152
+
153
+
154
+ __all__ = [
155
+ "FigureManager",
156
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oscura
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Unified hardware reverse engineering framework. Extract all information from any system through signals and data. Unknown protocol discovery, state machine extraction, CRC recovery, security analysis. 16+ protocols, IEEE-compliant measurements.
5
5
  Project-URL: Homepage, https://github.com/oscura-re/oscura
6
6
  Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
@@ -1,4 +1,4 @@
1
- oscura/__init__.py,sha256=IvoCA0vsnvD_yPvwtMWi4qX4q5FhsY7uiQFKghU85wQ,18313
1
+ oscura/__init__.py,sha256=JQy7jHn9bhuDQajZSL5Eq4H31pUdqNMEakzDrEf1FIQ,18313
2
2
  oscura/__main__.py,sha256=l1rnaD-tpI1W3cp1VHGhSdq9NDqw6Gxjf_gnqXf-zzE,11786
3
3
  oscura/convenience.py,sha256=o8f1Im8WpakGXRz8D4bV-XSNkzpgnVjsyVxnaxZ-dg4,14612
4
4
  oscura/exceptions.py,sha256=Ywyi7IhEG9XmbceCxAcLGKAddAOdP9Ph1ZT2NioMQCU,1606
@@ -14,16 +14,20 @@ oscura/acquisition/visa.py,sha256=phUwdlbphvNhSCaRgIXuPb8YDP0jR4eqY-OuJXCgRCo,12
14
14
  oscura/analyzers/__init__.py,sha256=LE-KFYoVePYsiPIy2NDNB2OrzbtqYezdCu9xqqPxgrY,985
15
15
  oscura/analyzers/measurements.py,sha256=ng5Qt2jyAvfKw3JQbJY_JNUqAOJEZwPo3UWa0xSg5Xk,697
16
16
  oscura/analyzers/validation.py,sha256=vHSKmLThwcU0j5Dat9QPbWImw_dqUGaZk_Ul6XbJ958,20376
17
- oscura/analyzers/digital/__init__.py,sha256=CrZxLveYI-nZ7INCZg-4zp8UP_uQRpMmX2vljzudJ6s,4228
17
+ oscura/analyzers/digital/__init__.py,sha256=uvsCUtA1V3PIinIf2l2CXPShx4qIYzNtD-oIGfFBU6E,5399
18
18
  oscura/analyzers/digital/bus.py,sha256=Wf3QUKNSxzXaWItR1rdf32kELayywrIg0TC-OhKEub0,22717
19
19
  oscura/analyzers/digital/clock.py,sha256=2WihQyf2fUlKTDAOKrhQSStiuUw711CvR6bMbkiliAc,26088
20
20
  oscura/analyzers/digital/correlation.py,sha256=_D-pmymVU1rTemSUfg_MklXCo03VkfAFcxSTLAV6jcY,23689
21
21
  oscura/analyzers/digital/edges.py,sha256=-Mlyh_SFkqs7L2n11bfYlv8bHD-jrfV6UByhXS1DLp0,20018
22
- oscura/analyzers/digital/extraction.py,sha256=wBOPZi3H1llCHsq36txz_jkEO--Sj6pbsxPZXXGk5_c,12144
22
+ oscura/analyzers/digital/extraction.py,sha256=OhePZrtAPHmUKbtEc3_lVXBKak2wT8OQD0ELJI69uIA,17980
23
+ oscura/analyzers/digital/ic_database.py,sha256=UUyeK1ckJXzv3oKhNOMJQcm9kmCx6g6SBA-eVHvvGO4,12393
23
24
  oscura/analyzers/digital/quality.py,sha256=bMXpmAhs15tjyiWW0Ao5aZcK_8AvEKyo_E3rtxDrFlo,27413
24
25
  oscura/analyzers/digital/signal_quality.py,sha256=Ssb1MkUfqjiENJJFOslkTX8Ef6C65HFCM_Ra20Bvp4k,30130
25
26
  oscura/analyzers/digital/thresholds.py,sha256=CrGgO1rtzkUOnYb40UT3_uD_0qVA853lGL2WNL95qv4,22428
26
27
  oscura/analyzers/digital/timing.py,sha256=eOo1jk-FfUd3tkqDndPTz-JO5tnfW9w4dEI-klgW-QU,34862
28
+ oscura/analyzers/digital/timing_paths.py,sha256=SQY7L7QPEm3IuiZGRULJtRJT1AbSLrc4OtKbahwb4eo,10433
29
+ oscura/analyzers/digital/vintage.py,sha256=3Ayufv-q2B4flhSG2DOrJkrIuiHnHDv5hbUHTR3dQQU,13910
30
+ oscura/analyzers/digital/vintage_result.py,sha256=Rn71FVyptdbP1gF-TvR3VX5ANIW2bi5YpM8huxyLKyU,4575
27
31
  oscura/analyzers/eye/__init__.py,sha256=SRW0Ir-1RWLwoaenk6FZhGOIWPkuhevYTPt_-8thPw0,974
28
32
  oscura/analyzers/eye/diagram.py,sha256=T3QwuZ3nvlHzSkmjp47ariRlt3FnfsK6yh3WsPszhmI,13307
29
33
  oscura/analyzers/eye/metrics.py,sha256=QDwtMxiBPSXbUCyFnTiAgWllbVCrcI4xEo6teZc3Cm8,17210
@@ -57,7 +61,7 @@ oscura/analyzers/power/ripple.py,sha256=4JZVeZxEivzoThKKTynSTgWEU_453QcoRtASmaYg
57
61
  oscura/analyzers/power/soa.py,sha256=lz6ExB-j-nCWAFSuPVd-TeSA4KD3QEasvZTzhBCaKnE,11019
58
62
  oscura/analyzers/power/switching.py,sha256=6GKfrM0LBfsSFoCCK8kAGQ48tbxnPsUWQ393iypBb0A,15884
59
63
  oscura/analyzers/protocol/__init__.py,sha256=DKCoqmpPHgB-Bz65GXArcoqScd714GAbL2eFxcccZEY,3035
60
- oscura/analyzers/protocols/__init__.py,sha256=nSW_dtZOL_m-qBvrQ8cgFiVKqsr8zehKvm3sf-9O8Rs,3376
64
+ oscura/analyzers/protocols/__init__.py,sha256=B6ovQ3U_QFXrnaqIiEpywOYOFhYuRgwG9aoVqL1zd4I,3861
61
65
  oscura/analyzers/protocols/base.py,sha256=muw9p0LbItduhB2qgt8F0aGodeyVrbM_-6rIIk6ZPfA,13651
62
66
  oscura/analyzers/protocols/can.py,sha256=pJGzMrjYJcaPrShdCxw7EMzwUlSNyvhBfuzOUha4JeQ,17810
63
67
  oscura/analyzers/protocols/can_fd.py,sha256=MYyB9y6LqUy1zZW0papzajU_RMJFnQeW2_6LTv9qjSM,12992
@@ -69,6 +73,7 @@ oscura/analyzers/protocols/jtag.py,sha256=CEQWx6g22v2fc14c7d8r2dyeqyfslA9BjKOdl0
69
73
  oscura/analyzers/protocols/lin.py,sha256=JEzF105t-3NeZGx0o-jrOj8JJ5NbU-ZgIWa9r_tKEOw,13692
70
74
  oscura/analyzers/protocols/manchester.py,sha256=C01r2u-DZQ-Zlb9P2wYHa-YpKz48HM7wSQAhSdrXNTI,10279
71
75
  oscura/analyzers/protocols/onewire.py,sha256=rZHg1zEuIIeHDqKhGS5LEC8lwiWGtdtW0i3Eo8RblFo,15852
76
+ oscura/analyzers/protocols/parallel_bus.py,sha256=sv0e_GzmcwnP_3nPz10ycWrLbaciuD5QoKVaE7q6vpw,14498
72
77
  oscura/analyzers/protocols/spi.py,sha256=gl0LVpZVI22tr7h5D1OAdDtlY_krb7CdNCNP10DirRI,10740
73
78
  oscura/analyzers/protocols/swd.py,sha256=NAInX2bZyZFCM03CLjjxraYTV7cCGOzcl_OEXU21qZE,10155
74
79
  oscura/analyzers/protocols/uart.py,sha256=6bf9EFHjHjkSeTxBq8b6GRlp1xWlBh65HuUcmWxWAEA,12188
@@ -110,7 +115,7 @@ oscura/api/fluent.py,sha256=Bvo1yVqqn3nmVWaoPv4C-YtYszBhHmdW8m5NdyhWEEo,15373
110
115
  oscura/api/operators.py,sha256=To4PZUrwInD43T7i2Sy8YD04eLoRsmrD6XYePuExUX8,13853
111
116
  oscura/api/optimization.py,sha256=5R6rPByVsyxla6oq4SjxjxEp9Uplog4owzsIuFcVoR0,11875
112
117
  oscura/api/profiling.py,sha256=vkYinleXrznWdd0OT5zIJN_PW289GQE_ODmR9DaCcQ0,10567
113
- oscura/automotive/__init__.py,sha256=3Wt44lFmx_zzyC1_IeukEpEnUagyM8TT0mWUnTpXb4s,2538
118
+ oscura/automotive/__init__.py,sha256=jq1rxBi385z0rwgZy6sgPGFGRrrzhg5vYi45-pO3VNc,2538
114
119
  oscura/automotive/visualization.py,sha256=2ILQjzNwCwj6zZ4MEsBS-QLwYFKMO0_0xDsbv3gEXu0,10692
115
120
  oscura/automotive/can/__init__.py,sha256=0WCLgE6juqQF_mTO716tWzfziOcM6cjshdb957G0edw,1283
116
121
  oscura/automotive/can/analysis.py,sha256=0z6MycxuJGusqDQhYEpHnGRmDw3OMf5yDbS8zI6GJO0,11251
@@ -127,7 +132,6 @@ oscura/automotive/dbc/__init__.py,sha256=7s36h4LQrJKKkO3ICHeuVCoYVx8jGnHT_wKcJgO
127
132
  oscura/automotive/dbc/generator.py,sha256=EqJKJikAK2Neaff2H9AGb8ZnseE8m4lFAFRMXEIwjsY,5616
128
133
  oscura/automotive/dbc/parser.py,sha256=mOUOJEF82cb7pqMvjedowB8AggCnxoR252vpSy5kC2Q,4591
129
134
  oscura/automotive/dtc/__init__.py,sha256=09CgvnClJTQIvzgDOQ22CbcjGAg_zOhPlbm1-k-gl30,895
130
- oscura/automotive/dtc/data.json,sha256=OrymnbjQkVMdJlIeQ6MUDIihkd9Kea-YvAizZwOZWcc,80011
131
135
  oscura/automotive/dtc/database.py,sha256=We6Kq_lQNHCy9eGKLg-5ArMZ5KOlWK8599_J-67h3DU,9550
132
136
  oscura/automotive/j1939/__init__.py,sha256=aiyfUq3GkJhgpxfkzsX7n_-E7B9Ls0XSnFxRI12GF28,340
133
137
  oscura/automotive/j1939/decoder.py,sha256=qSfok5RTuwc4vR5sjnEdTOi06TwaNfIhBtZq6Vpzhik,25115
@@ -236,7 +240,8 @@ oscura/exploratory/parse.py,sha256=1m3u6MAyGQOjkGESPT84YzyS-quI-73o0-bj041SzAk,1
236
240
  oscura/exploratory/recovery.py,sha256=7nqk5nU6M0nViCvy3JnhgD64YgPDik1mgIyGGVCOj3g,9638
237
241
  oscura/exploratory/sync.py,sha256=6lcLt7GmZoRj9luZkNSjTRIuG7kTnxgONdBp0YSQKns,12610
238
242
  oscura/exploratory/unknown.py,sha256=_gByru0b0BvKfZWH0m8DgXNC0dGVW-O_vBo7Jwe6-qE,21614
239
- oscura/export/__init__.py,sha256=TVVAw5rmbmQSNed3VOD4Fy2mSknwaAzI-oCoLgPKhXI,770
243
+ oscura/export/__init__.py,sha256=vk-N_lDoQG4DKhijOikusmgpP2B-2dIHupGhCt7k3S4,1014
244
+ oscura/export/wavedrom.py,sha256=jg07h8pZ7sHBh3wfW16xE4dtAbt7CDZpS1xixc20KvE,12388
240
245
  oscura/export/wireshark/README.md,sha256=44ji8SuD7o-PCNKCGZ9Y3NIoKKnwUrwx2ZgSSuMI_2E,7395
241
246
  oscura/export/wireshark/__init__.py,sha256=Int_19KSBJP8J78LfdibB0S6aDAfbQZJLMap6HZwWSc,1449
242
247
  oscura/export/wireshark/generator.py,sha256=kCYtBxSyYdglriV3lcW2yfNBEYkfYV4K6oaegd3ulG0,10561
@@ -249,11 +254,12 @@ oscura/exporters/csv.py,sha256=4LLnWWnbmhjSMCq4ayBe0EIK53mp2l0OcK_FBUnnv_4,9186
249
254
  oscura/exporters/exporters.py,sha256=wJAr2R62dWk6YCiJcK3QyUa9fS3Au8UhZb4nsY7CQJI,899
250
255
  oscura/exporters/hdf5.py,sha256=6YsXtqlkkjeqlg2wh_QjUf7jQMu0J3eCvVgxjX3lW8Y,5956
251
256
  oscura/exporters/html_export.py,sha256=kdlPCOTJzriY88i6ufDe6HMYo3fKDilgQazL3nADFQY,19446
252
- oscura/exporters/json_export.py,sha256=n0tkVSlsNaEmch-cuEF3F0247RWYDqpaA07fzmrMDOM,8443
257
+ oscura/exporters/json_export.py,sha256=HhtjWrkQL-ziTlFM_AHvzBx37LUmIRz6AChkPfZgtWQ,9897
253
258
  oscura/exporters/markdown_export.py,sha256=JdPDm9UmUcT6ikrDZvurdWGy0hXSUbjGjlMyUct8TpM,11957
254
259
  oscura/exporters/matlab_export.py,sha256=YKAvPtFWj9-ISpN6cZu1s2wI0wNu_zKIrasZxh5ADnA,11003
255
260
  oscura/exporters/npz_export.py,sha256=RMSZQH5M8C-ELoIVkQakcZ-ETQaOnnWJiHGEqcrtYVo,6063
256
261
  oscura/exporters/spice_export.py,sha256=E0vkJ0AVxzzAOR4BX9afnGOfbltJQsIEWSumh1EZF9o,6515
262
+ oscura/exporters/vintage_logic_csv.py,sha256=CeiOkIcUe8MzPyIHQyIBrjMEDM0wAVJEBKx-Pbhr9ig,7405
257
263
  oscura/extensibility/__init__.py,sha256=B2wrC7j-swzJkNdQwHS0lXr6FVBy3XWrwZ4dvtdt2gs,2955
258
264
  oscura/extensibility/docs.py,sha256=BW5c-s-UvYmqkVoe7SidLw3I_FhzMhCeY--rE2pMex8,21738
259
265
  oscura/extensibility/extensions.py,sha256=22QwZOS1D8KPKAQPnCIb9jRLwXi8fwCwqwPGcpeLTJI,38888
@@ -351,7 +357,7 @@ oscura/quality/ensemble.py,sha256=okfIQmsypHqQTmBfd_uRXLKshs7E1DbU-jFGSBMQTCc,28
351
357
  oscura/quality/explainer.py,sha256=2WIaetGgS1ivwJaJbanOMWWwNTqQhrrn2zemxCCwZII,10729
352
358
  oscura/quality/scoring.py,sha256=gsIl-2164vGS1LcSP7x29D2hfKLPxee3mmuaFPwQ9Ko,19020
353
359
  oscura/quality/warnings.py,sha256=qdnoe9qh0WJnupqgJzgkEzAZMOgDckGJXC9fKF36Rs8,13469
354
- oscura/reporting/__init__.py,sha256=b3w_Q-nmCNjn99eyLgVUHEDkzwzdYupx8lmlrpxS-eQ,6068
360
+ oscura/reporting/__init__.py,sha256=l6X2PxnE_ZwTMNHZWAtOFSmaUkxZmcWCBTxbF7586bo,6274
355
361
  oscura/reporting/advanced.py,sha256=dcu2fjCA_a4R7lGhdUQbcAb7ioTg7lkUwDiQK4uopjM,36413
356
362
  oscura/reporting/analyze.py,sha256=7tjXGsi3nWyX9I4Tw9nSX6BHD5E7Mu3tpuZAQi2S2hQ,14612
357
363
  oscura/reporting/argument_preparer.py,sha256=L0FB0EGmUyP-GjTgEncvkpVbWMrbncoHTiBIOR5avUo,24095
@@ -376,6 +382,7 @@ oscura/reporting/standards.py,sha256=nC3wOZThj6IMCRpdE9HL8mwcvArRwzhkX92yHox2-qo
376
382
  oscura/reporting/summary_generator.py,sha256=GOPVUCNNZPFn8aVM9YCqFG-wkCTFhRZt--kIyRkOzX4,10622
377
383
  oscura/reporting/tables.py,sha256=VlUAwqv9sPGyj-1A93nCpP-JhYs5TunaJX2oNzHgVcw,11622
378
384
  oscura/reporting/template_system.py,sha256=jPF5jkkjl8el8V6IGJGNZmPlNRFZd0_DBbcokOUMiTU,21135
385
+ oscura/reporting/vintage_logic_report.py,sha256=-RyYYEKhP1f6yyhJ41fCkaZHw-nUcSd_CWd-jFgXxDw,15111
379
386
  oscura/reporting/content/__init__.py,sha256=MIU1IrYdFy7L7d6CY8RxkzL1_wL1qLYUfzUsKaASgJ4,874
380
387
  oscura/reporting/content/executive.py,sha256=AQlQMPRLy2rPwPs6Y7somVeg8USIhlPGouYZlMq5rOA,4255
381
388
  oscura/reporting/content/filtering.py,sha256=JrSPJPyGw_jsZUWlAi-ELt8b2ybh1Ui_wXWULv0R-ng,5184
@@ -394,10 +401,6 @@ oscura/reporting/templates/definition.py,sha256=KC--ESq6Ja9OA_hC3uVP3--Y_rhUEIUn
394
401
  oscura/reporting/templates/index.html,sha256=V74N-0erqnu8tevVFjPT-zMXi5M-7RSvTfujW9pwQPQ,16007
395
402
  oscura/reporting/templates/index.md,sha256=3PrVNVnI6kAdiG5l2JROH9AwarGYTG0GmAdVQKGyYPY,3533
396
403
  oscura/schemas/__init__.py,sha256=0zVM3hatGgl3onywiWNia8ov0TJ-tFqXz_cBzuZW7nU,4317
397
- oscura/schemas/bus_configuration.json,sha256=gpcDsg04760KCaLeIDuWvP6RzRUcPZuQplJbe7xpc8E,9562
398
- oscura/schemas/device_mapping.json,sha256=sYOcc2zSe0rmMQN_vtg3Y5XeeDMktAO1ar8vAWl-E1M,5499
399
- oscura/schemas/packet_format.json,sha256=y2KavMGeOUlmjDq7AW_85bfTk3nHlGPuistpuVDdlAk,12893
400
- oscura/schemas/protocol_definition.json,sha256=VPHkgY4fAI-hUiRBtiqZvDNUGjp6_7O4xdi1z36IhCI,11256
401
404
  oscura/search/__init__.py,sha256=eoX7yKNILdlmlFCpt-QHVuT2dUGw6m2GMYrQv5w-mhc,413
402
405
  oscura/search/anomaly.py,sha256=JHcnB9Ba6Hk93vpYedj2Olv6_L_3xnOg8mn6UEyoE6A,9805
403
406
  oscura/search/context.py,sha256=vJ4lWXcC3R7N0vTyTorsZa3KkFLHkd6vQpmhmMeSEIQ,4857
@@ -426,7 +429,7 @@ oscura/ui/__init__.py,sha256=BT4w05Hd7Tg2dM_00cs3G4RJQnj0a56o9uf-41FV7cs,919
426
429
  oscura/ui/formatters.py,sha256=34Wjz1r4FsaGrzdcjltOAyDIvWAjji1wTJaSYn1QYBo,13650
427
430
  oscura/ui/progressive_display.py,sha256=LKGRJrSAscdoUKrBhKZzpYJlnNBX-kOTUGmJCsufFSI,10314
428
431
  oscura/utils/__init__.py,sha256=GaasTJFnZBru-vBPiZQaoGZq65x5ys9trDaIQWuclWc,2270
429
- oscura/utils/autodetect.py,sha256=cP-_be6XK9neO28J2le1iZ8YLvPmfpc8L-p6KAlA6h8,9324
432
+ oscura/utils/autodetect.py,sha256=wJI2qAs-Efz2eRmy61meSJHW9SyGZFZSUe0dYWBez_8,9473
430
433
  oscura/utils/buffer.py,sha256=H-lKT0MBe0fqMoX5UCYftFUaadhSF_Ydwrf7VL8KBy8,10327
431
434
  oscura/utils/lazy.py,sha256=tUy9oZGGjulS4raEbuKvUcdnToCO1y3hKxisCxY1Xm0,11825
432
435
  oscura/utils/lazy_imports.py,sha256=GA1yAu3CowOGmsTmNnh42d2afP6DtG6o-6u2iJe85G8,3990
@@ -441,7 +444,9 @@ oscura/visualization/annotations.py,sha256=01ieilFN6CmmzrMzyWF_G9IR5I7W6XKW-5hTT
441
444
  oscura/visualization/axis_scaling.py,sha256=19TSQgF5s0I2GSFdLNazwjtMdACBB7fDJwUyDtFCSuc,9300
442
445
  oscura/visualization/colors.py,sha256=nw8h4u8lSN8Oq9sqJuKOmrlC8tOcnuvF8xYtP2LvZso,12046
443
446
  oscura/visualization/digital.py,sha256=ChKrsQu6z9ZVoMmTdxWhkNu6B7od0SEtZ1fVq_y9ts0,10096
447
+ oscura/visualization/digital_advanced.py,sha256=9wMpDNtpDqHy2uZaP32NM7MMQfly5v4nqK5oHXQJ33U,22836
444
448
  oscura/visualization/eye.py,sha256=rqv34ZtVE58bZUlUrO__5Cgps-PT-HeGbjPI6CrbEcg,12848
449
+ oscura/visualization/figure_manager.py,sha256=dG0xsvGVBBomaZPprogGHR2TG3DdK75u72agn8gwu_Q,4495
445
450
  oscura/visualization/histogram.py,sha256=8MYLV9i3XufDChvo27BuruTRR2pOIUN592fqNsjC9jM,7068
446
451
  oscura/visualization/interactive.py,sha256=KRSsBngArbs5LNZgzVQlMSLJPLvmG5u-ScSj43wvKRQ,25462
447
452
  oscura/visualization/jitter.py,sha256=Zib_cShNShvH9qZT8crZHTsMk5hmGc2a7qgO2vvwEco,20526
@@ -474,8 +479,8 @@ oscura/workflows/power.py,sha256=fpTzoIfuZi69ldtu2KAHW-Qu6jzA5jBa_9LVy6xqpTI,608
474
479
  oscura/workflows/protocol.py,sha256=x3T-M81vFVrW3mouaYA8WjxyLLzZyLATVJbiqcMAVFQ,15275
475
480
  oscura/workflows/reverse_engineering.py,sha256=K_yrqrQqQNcCoB0jRAG92e2zy8er3oiKJWSF6lU4nGk,19929
476
481
  oscura/workflows/signal_integrity.py,sha256=p-DOC-AhzQOkG_jyyBK3EUaIBAGZhAhdmo-Ub_ifC3U,8391
477
- oscura-0.4.0.dist-info/METADATA,sha256=Usu1H_SaG7TkKGT33lnwM0WfPH4FB-icct_YbUwO1EM,16212
478
- oscura-0.4.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
479
- oscura-0.4.0.dist-info/entry_points.txt,sha256=QLBxd-iTjBQ5HidaVSkLBwvUsqxSG1ZTJ6i-0juu960,48
480
- oscura-0.4.0.dist-info/licenses/LICENSE,sha256=p1_oEK-oqWDXMFSv5mKbyYkgW-CPbCnFUvdICu490aY,1077
481
- oscura-0.4.0.dist-info/RECORD,,
482
+ oscura-0.5.0.dist-info/METADATA,sha256=W_eBFGCar4hKFM9LNN_hFgSh8iN092gAbE2QmilSIgw,16212
483
+ oscura-0.5.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
484
+ oscura-0.5.0.dist-info/entry_points.txt,sha256=QLBxd-iTjBQ5HidaVSkLBwvUsqxSG1ZTJ6i-0juu960,48
485
+ oscura-0.5.0.dist-info/licenses/LICENSE,sha256=p1_oEK-oqWDXMFSv5mKbyYkgW-CPbCnFUvdICu490aY,1077
486
+ oscura-0.5.0.dist-info/RECORD,,