pyxcp 0.22.24__tar.gz → 0.22.25__tar.gz
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 pyxcp might be problematic. Click here for more details.
- {pyxcp-0.22.24 → pyxcp-0.22.25}/PKG-INFO +1 -1
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyproject.toml +1 -1
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/__init__.py +1 -1
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/__init__.py +1 -1
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/stim_wrapper.cpp +3 -1
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/master/master.py +41 -40
- {pyxcp-0.22.24 → pyxcp-0.22.25}/CMakeLists.txt +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/LICENSE +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/README.md +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/build_ext.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/EtasCANMonitoring.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/EtasCANMonitoring.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCP_Common.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCPonCAN.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCPonEth.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCPonFlx.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCPonSxI.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/XCPonUSB.aml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/ifdata_CAN.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/ifdata_Eth.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/ifdata_Flx.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/ifdata_SxI.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/aml/ifdata_USB.a2l +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/asam/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/asam/types.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/asamkeydll.c +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/asamkeydll.sh +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/checksum.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cmdline.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/config/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/config/legacy.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/constants.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/bin.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/blockmem.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/daqlist.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/event.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/extension_wrapper.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/helper.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/mcobject.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/cpp_ext/tsqueue.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/optimize/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/optimize/binpacking.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/scheduler.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/scheduler.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/stim.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/daq_stim/stim.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/dllif.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/errormatrix.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_can.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_can_user.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_can_vector.json +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_can_vector.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_eth.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_nixnet.json +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_socket_can.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_sxi.json +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/conf_sxi.toml +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/ex_arrow.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/ex_csv.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/ex_excel.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/ex_mdf.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/ex_sqlite.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/run_daq.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcp_policy.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcp_read_benchmark.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcp_skel.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcp_unlock.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcp_user_supplied_driver.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcphello.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/examples/xcphello_recorder.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/master/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/master/errorhandler.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/py.typed +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/build_clang.cmd +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/build_clang.sh +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/build_gcc.cmd +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/build_gcc.sh +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/build_gcc_arm.sh +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/converter/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/lz4.c +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/lz4.h +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/lz4hc.c +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/lz4hc.h +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/mio.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/reader.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/reco.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/recorder.rst +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/rekorder.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/rekorder.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/setup.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/test_reko.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/unfolder.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/wrap.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/recorder/writer.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/pyxcp_probe_can_drivers.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/xcp_examples.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/xcp_fetch_a2l.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/xcp_id_scanner.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/xcp_info.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/scripts/xcp_profile.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/stim/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_asam_types.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_binpacking.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_can.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_checksum.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_daq.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_frame_padding.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_master.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_transport.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/tests/test_utils.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/timing.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/base.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/base_transport.hpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/can.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/eth.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/sxi.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/transport_wrapper.cpp +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/transport/usb_transport.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/types.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/utils.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/vector/__init__.py +0 -0
- {pyxcp-0.22.24 → pyxcp-0.22.25}/pyxcp/vector/map.py +0 -0
|
@@ -36,7 +36,7 @@ dynamic = ["license", "readme", "authors", "requires-python", "description", "cl
|
|
|
36
36
|
[tool.poetry]
|
|
37
37
|
authors = ["Christoph Schueler <cpu.gems@googlemail.com>"]
|
|
38
38
|
name = "pyxcp"
|
|
39
|
-
version = "0.22.
|
|
39
|
+
version = "0.22.25"
|
|
40
40
|
readme = "README.md"
|
|
41
41
|
description = "Universal Calibration Protocol for Python"
|
|
42
42
|
keywords = ["automotive", "ecu", "xcp", "asam", "autosar"]
|
|
@@ -38,7 +38,7 @@ class DaqProcessor:
|
|
|
38
38
|
def setup(self, start_datetime: Optional[CurrentDatetime] = None, write_multiple: bool = True):
|
|
39
39
|
if not self.xcp_master.slaveProperties.supportsDaq:
|
|
40
40
|
raise RuntimeError("DAQ functionality is not supported.")
|
|
41
|
-
self.daq_info = self.xcp_master.getDaqInfo()
|
|
41
|
+
self.daq_info = self.xcp_master.getDaqInfo(include_event_lists=False)
|
|
42
42
|
if start_datetime is None:
|
|
43
43
|
start_datetime = CurrentDatetime(time_ns())
|
|
44
44
|
self.start_datetime = start_datetime
|
|
@@ -15,7 +15,9 @@ using namespace py::literals;
|
|
|
15
15
|
|
|
16
16
|
PYBIND11_MODULE(stim, m) {
|
|
17
17
|
py::class_<DaqEventInfo>(m, "DaqEventInfo")
|
|
18
|
-
.def(py::init<const std::string&, std::int8_t, std::size_t, std::size_t, std::size_t, std::string_view, bool, bool, bool>()
|
|
18
|
+
.def(py::init<const std::string&, std::int8_t, std::size_t, std::size_t, std::size_t, std::string_view, bool, bool, bool>(),
|
|
19
|
+
"name"_a, "type_code"_a, "cycle"_a, "max_daq_lists"_a, "priority"_a, "consistency"_a, "daq_supported"_a,
|
|
20
|
+
"stim_supported"_a, "packed_supported"_a
|
|
19
21
|
);
|
|
20
22
|
|
|
21
23
|
py::class_<Stim>(m, "Stim")
|
|
@@ -1670,7 +1670,7 @@ class Master:
|
|
|
1670
1670
|
self.logger.debug(f"Our checksum : 0x{cc:08X}")
|
|
1671
1671
|
return cs.checksum == cc
|
|
1672
1672
|
|
|
1673
|
-
def getDaqInfo(self):
|
|
1673
|
+
def getDaqInfo(self, include_event_lists=True):
|
|
1674
1674
|
"""Get DAQ information: processor, resolution, events."""
|
|
1675
1675
|
result = {}
|
|
1676
1676
|
dpi = self.getDaqProcessorInfo()
|
|
@@ -1711,45 +1711,46 @@ class Master:
|
|
|
1711
1711
|
result["resolution"] = resolutionInfo
|
|
1712
1712
|
channels = []
|
|
1713
1713
|
daq_events = []
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
"
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1714
|
+
if include_event_lists:
|
|
1715
|
+
for ecn in range(dpi.maxEventChannel):
|
|
1716
|
+
eci = self.getDaqEventInfo(ecn)
|
|
1717
|
+
cycle = eci["eventChannelTimeCycle"]
|
|
1718
|
+
maxDaqList = eci["maxDaqList"]
|
|
1719
|
+
priority = eci["eventChannelPriority"]
|
|
1720
|
+
time_unit = eci["eventChannelTimeUnit"]
|
|
1721
|
+
consistency = eci["daqEventProperties"]["consistency"]
|
|
1722
|
+
daq_supported = eci["daqEventProperties"]["daq"]
|
|
1723
|
+
stim_supported = eci["daqEventProperties"]["stim"]
|
|
1724
|
+
packed_supported = eci["daqEventProperties"]["packed"]
|
|
1725
|
+
name = self.fetch(eci.eventChannelNameLength)
|
|
1726
|
+
if name:
|
|
1727
|
+
name = decode_bytes(name)
|
|
1728
|
+
channel = {
|
|
1729
|
+
"name": name,
|
|
1730
|
+
"priority": eci["eventChannelPriority"],
|
|
1731
|
+
"unit": eci["eventChannelTimeUnit"],
|
|
1732
|
+
"cycle": eci["eventChannelTimeCycle"],
|
|
1733
|
+
"maxDaqList": eci["maxDaqList"],
|
|
1734
|
+
"properties": {
|
|
1735
|
+
"consistency": consistency,
|
|
1736
|
+
"daq": daq_supported,
|
|
1737
|
+
"stim": stim_supported,
|
|
1738
|
+
"packed": packed_supported,
|
|
1739
|
+
},
|
|
1740
|
+
}
|
|
1741
|
+
daq_event_info = DaqEventInfo(
|
|
1742
|
+
name,
|
|
1743
|
+
types.EVENT_CHANNEL_TIME_UNIT_TO_EXP[time_unit],
|
|
1744
|
+
cycle,
|
|
1745
|
+
maxDaqList,
|
|
1746
|
+
priority,
|
|
1747
|
+
consistency,
|
|
1748
|
+
daq_supported,
|
|
1749
|
+
stim_supported,
|
|
1750
|
+
packed_supported,
|
|
1751
|
+
)
|
|
1752
|
+
daq_events.append(daq_event_info)
|
|
1753
|
+
channels.append(channel)
|
|
1753
1754
|
result["channels"] = channels
|
|
1754
1755
|
self.stim.setDaqEventInfo(daq_events)
|
|
1755
1756
|
return result
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|